2010-10-05 26 views
4

我正在尝试制作UIView/UIControl,用户可以拖动并显示文本框,然后向下拖动以隐藏它。然而,我还没有找到一种使这种“流动”的方法 - 它似乎总是在随机的地方停下来,并且不允许有更多的动作。目前我正在使用UIView作为视图的顶部,这里是当前的代码:CocoaTouch中的下拉菜单

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch *touch = [touches anyObject]; 

if ([touch view] == topMenuView) { 
    CGPoint location = [touch locationInView:self.superview]; 

    CGPoint locationInsideBox = [touch locationInView:self]; 

    CGPoint newLocation = location; 
    newLocation.x = self.center.x; 
    newLocation.y = newLocation.y + (self.frame.size.height - locationInsideBox.y)/2; 

    if ((self.superview.frame.size.height - newLocation.y) < (self.frame.size.height/2) && (self.superview.frame.size.height - newLocation.y) > -32) 
    { 
    self.center = newLocation; 
    } 
    return; 
} 
} 

任何帮助将不胜感激!

回答

1

我会使用平移手势识别器。以下代码将简单地将视图与用户的手指一起上下移动。如果你想限制它移动的距离,请将它放置到位或者需要增加它的动量。

UIView * view; // The view you're moving 
CGRect originalFrame; // The frame of the view when the touch began 

- (void) pan:(UIPanGestureRecognizer *)pan { 
    switch (pan.state) { 
     case UIGestureRecognizerStateBegan: { 
      originalFrame = view.frame; 
     } break; 

     case UIGestureRecognizerStateChanged: 
     case UIGestureRecognizerStateEnded: { 
      CGPoint translation = [pan translationInView:view]; 
      CGRect frame = originalFrame; 
      frame.origin.y += translation.y; 
      view.frame = frame; 
     } break; 
    } 
} 
+0

感谢您的回复,Cory!我目前使用“if(translation.y <(self.frame.size.height - topView.frame.size.height)&& translation.y> 0)”来限制视图向上移动的距离。它第一次效果很好,但对于第二次,它只能根据过去的帧进行调整。有没有办法解决这个问题? – PF1 2010-10-31 02:46:27

0

删除此行很可能帮助你:

newLocation.y = newLocation.y + (self.frame.size.height - locationInsideBox.y)/2; 
0

什么你要做到的是真的没有什么比一个滚动的看法比较多,所以我会建议使用一个UIScrollView。

把你的UIView放在带有透明背景的UIScrollView中,并将UIScrollView放在你的文本框上。设置正确的contentSize,你很好。

+0

的问题,这是接近的UIScrollView将不得不在“文本框”的顶部(我明白这是一个的UITextField或UITextView的 - 也许是错误的)。在这种情况下,需要对响应者链或z顺序进行特殊处理。 – 2010-10-12 09:22:32

0

使用uiview动画块更新与接收到的触点相对应的滑动视图的框架。将动画块持续时间设置为像.01或更低的非常短的内容。

0

我建议你两种分裂问题:

  • 实现其在底部的文本框中的观点 - 你只需要实现自己的自定义视图/视图控制器。
  • 将您的视图添加为UIScrollView的子视图。

This是一个很好的教程,它演示了UIScrollView的正确初始化并在其中嵌入内容。

自定义视图/控制器是一个更广泛的主题:)