【问题标题】:Ignoring Touch Events of embedded UIButtons when scrolling UICollectionView滚动 UICollectionView 时忽略嵌入式 UIButtons 的触摸事件
【发布时间】:2014-03-03 23:00:20
【问题描述】:

我有一个自定义 UICollectionViewCell,其中包含一些自定义 UIView 对象。这些 UIView 中的每一个都有一个 UIButton,它响应 IBActions 链接的 Touch Down 和 Touch Up Inside。基本上,我希望这些按钮在按下时缩小并在松开时弹回原来的大小。我可以通过控件轻松完成此操作,并且按下和按下即可。但是,我面临的问题是在将滚动引入混合时发生的。这些单元格所在的 UICollectionView 是滚动的。如果我在开始滚动时碰巧触摸了一个按钮,则会触发 Touch Down 事件以及 UICollectionView 的滚动事件。如果我没记错的话,iOS7 之前的情况并非如此。当滚动事件开始时,UIButton 事件没有被触发,我认为它与 delaysContentTouches 有关。这看起来现在被打破或改变了。它实际上仍然可以在 iPhone 上正常运行,只是在 iPad 上不行。如果我在 iPad 上滚动视图,在嵌入式 UIButton 内开始触摸,按钮将缩小,按钮操作将被触发。

所以,我尽可能简单地重申这个问题:在滚动发生时是否有忽略嵌入式 UIButtons 的触摸?当没有触发滚动时,触摸工作正常,如果用户确实在滚动,我只是不希望事件触发。有什么解决办法吗?

如果您需要任何更具体的细节,我很乐意帮助您理解。

【问题讨论】:

  • 你解决过这个问题吗?我遇到了完全相同的问题。

标签: ios objective-c cocoa-touch


【解决方案1】:

你需要继承scrollView(collectionView或tableView)并覆盖

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:UIButton.class]) {
    return YES;
}
return [super touchesShouldCancelInContentView:view];

}

迅速

override func touchesShouldCancelInContentView(view: UIView) -> Bool { if view is UIButton { return true } return super.touchesShouldCancelInContentView(view) }

就是这样,您现在可以滚动按钮而不丢失按钮点击事件。

【讨论】:

    【解决方案2】:

    在我的 UICollectionView 中,即使 UICollectionView 仍在减速,UICollectionViewCells 内的按钮也注册了 TouchUpInside-taps,这听起来与您遇到的问题类似。我创建了一个覆盖 beginTrackingWithTouch:withEvent 的 UIButton 子类,如果它包含的 UIScrollView 正在减速或拖动,它将返回 NO。

    - (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
    {
        UIView *superView = self;
        while((superView = [superView superview])) {
            if ([superView isKindOfClass:UIScrollView.class]) {
                UIScrollView *scrollView = (UIScrollView *)superView;
    
                if (scrollView.isDecelerating || scrollView.isDragging) {
                    return NO;
                }
            }
        }
    
        return [super beginTrackingWithTouch:touch withEvent:event];
    }
    

    【讨论】:

      【解决方案3】:

      想到的最简单的尝试是检查触发按钮操作时UIScrollView(您的UICollectionView)是否正在滚动或拖动。

      if(! self.collectionView.dragging && ! self.collectionView.decelerating)
      {
        // do action because we are not moving
      }
      

      你试过了吗?

      【讨论】:

      • 好吧,动作是从 UICollectionViewCell 内的 UIView 内的 UIButton 触发的。因此,我尝试将 CollectionView 作为超级视图访问,并根据它是减速还是拖动来确定是否应该执行该操作,CollectionView 返回它没有拖动或减速,即使它是。
      • 您可以创建一个示例项目,我可以下载来尝试一下吗?
      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      相关资源
      最近更新 更多