【问题标题】:Pull Menu in CocoaTouchCocoaTouch 中的拉菜单
【发布时间】:2011-04-21 08:57:24
【问题描述】:

我正在尝试制作一个 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;
 }
}

任何帮助将不胜感激!

【问题讨论】:

    标签: iphone cocoa-touch uiview uikit uicontrol


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这个问题是 UIScrollView 必须在“文本框”的顶部(我理解为 UITextField 或 UITextView - 可能是错误的!)。在这种情况下,需要对响应者链或 z 顺序进行一些特殊处理。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我建议将问题一分为二:

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

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

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

        【讨论】:

          【解决方案5】:

          我会使用平移手势识别器。下面的代码将简单地随着用户的手指上下移动视图。如果你想限制它向上移动的距离,让它快速放置或有你需要添加到它的动力。

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

          【讨论】:

          • 感谢您的回复,科里!我目前正在使用“if (translation.y 0)”来限制视图向上移动的距离。第一次效果很好,但第二次它只根据过去的帧进行调整。有没有办法解决这个问题?
          猜你喜欢
          • 2012-07-05
          • 1970-01-01
          • 2015-03-15
          • 2019-12-05
          • 2018-01-27
          • 2016-08-01
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多