在 UIScrollView 中拖动 UIButtons?

Posted

技术标签:

【中文标题】在 UIScrollView 中拖动 UIButtons?【英文标题】:Dragging UIButtons in UIScrollView? 【发布时间】:2011-11-16 05:36:01 【问题描述】:

我的主视图中有一个滚动视图,我的滚动视图中有三个子视图。我的所有子视图中都有 UIButtons。

现在,我想将这些按钮从一个子视图拖动到另一个子视图(拖动按钮时,滚动视图不应滚动)。

我该怎么做?

【问题讨论】:

【参考方案1】:

我不完全确定这个 sn-p 是否适用于这种特殊情况(UIScrollView 中的 UIControl),但我对 UIResponder 链的理解表明它应该:)

- (void)viewDidLoad  // or wherever you initialize your things
    ...
    // Add swipe event to UIButton so it will capture swipe intents
    UIPanGestureRecognizer *panGR = [[UIPanGestureRecognizer alloc] init];
    [panGR addTarget:self action:@selector(panEvent:)];
    [button addGestureRecognizer:panGR];
    [panGR release];


- (void)panEvent:(id)sender 
    button.center = [sender locationInView:self.view];

如果这有效(现在无法测试,但在类似情况下它确实对我有效),那么您应该添加更多代码来处理拖放相关事件(可能禁用 UIScrollView 中的 Clip Subviews 选项, 如果位置与目的地的 CGRect 相交,则将按钮添加到新的超级视图,如果不相交,则将按钮返回到原始位置,等等)。

那么,这些行中发生了什么?当您开始触摸 UIButton 时,订单不会到达 UIScrollView,因为该事件可以作为触摸事件(由 UIButton 处理)或作为平移事件(由 UIScrollView 处理)跟随。当您移动手指时,UIButton 的响应者会解除该事件,因为没有Gesture Recognizer 知道如果手指移动了如何继续。

但是当你向 UIButton 添加手势识别器时,它实际上知道当手指移动时要做什么,一切都不同了:UIButton 不会关闭事件,并且 UIScrollView 永远不会意识到有触摸移动它。

我希望我的解释足够准确和易于理解。如果 a) 它不起作用或 b) 有什么不清楚的地方,请告诉我。

祝你好运:)

【讨论】:

非常感谢您的帮助。按钮移动很好。同时,我只想为 button.center 分配准确的点,为了执行准确的移动,我需要使用 touchesBegan ,touchesMoved,touchesEnded。使用此方法时,触摸功能不起作用.....怎么办? 当开始使用 touchesBegan、Moved 和 Ended 时,您将关闭所有手势和响应链功能。使用 UIPanGestureRecognizer,您可以使用 locationInView 访问触摸的确切位置,它会返回一个相对于您作为参数传递的视图(在本例中为主视图)的 CGPoint。不适合您的情况?【参考方案2】:
Try
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
       if (allowAppDrag && [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) 
        return NO;
    

   return YES;

【讨论】:

以上是关于在 UIScrollView 中拖动 UIButtons?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 中模拟拖动结束

在 UIScrollview 中禁用对角线拖动

UIScrollView 在拖动和点击之间做出决定

在无限 UIScrollView 中跨页面拖动视图

拖动包含 UIScrollView 的 UIView

如何在 UIScrollView 中同时拖动和移动某些东西并滚动