在CocoaTouch中拉菜单

时间:2010-10-05 15:17:04

标签: iphone cocoa-touch uiview uikit uicontrol

我正在尝试创建一个UIView / UIControl,人们可以向上拖动并显示一个文本框,然后向下拖动以隐藏它。但是,我还没有找到一种方法来使这种“流动” - 它总是似乎停留在随机的地方,不允许任何更多的运动。目前我正在使用UIView作为视图的顶部,这是当前的代码:

- (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;
 }
}

非常感谢任何帮助!

5 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

删除此行可能会对您有所帮助:

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

答案 2 :(得分:0)

你想要完成的只是一个可滚动的视图,所以我建议使用UIScrollView。

将UIView放在具有透明背景的UIScrollView中,并将UIScrollView放在文本框的顶部。设置正确的contentSize,你就可以了。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我建议将问题分成两部分:

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

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

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