首页 文章

滚动UICollectionView时忽略嵌入式UIButton的触摸事件

提问于
浏览
1

我有一个自定义UICollectionViewCell,它有一些驻留在其中的自定义UIView对象 . 这些UIViews中的每一个都有一个UIButton,它响应由IBActions链接的Touch Down和Touch Up Inside . 基本上,我希望这些按钮在按下时缩小,并在松开时弹回原始尺寸 . 我可以通过控制和按下并按下工作轻松完成此操作 . 但是,当滚动引入混合时,我遇到的问题就出现了 . 这些单元格的UICollectionView是一个滚动的单元格 . 如果我在启动滚动时碰巧碰到按钮,则会触发Touch Down事件以及UICollectionView的滚动事件 . 如果我没记错的话,这在iOS7之前就不是这样了 . 当滚动事件开始时,UIButton事件没有被触发,我认为它与delayedContentTouches有关 . 现在看来要打破或改变 . 它实际上仍然适用于iPhone,而不是在iPad上 . 如果我在iPad上滚动我的视图,在嵌入式UIButton内部启动触摸,按钮将缩小,按钮操作将被触发 .

所以尽可能明白地重申这个问题:当滚动发生时,无论如何都忽略了嵌入式UIButton的触摸?触摸没有滚动时触摸工作正常,我只是不希望事件在用户确实滚动时触发 . 有没有解决方法?

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

3 回答

  • 2

    在我的UICollectionView中,UICollectionViewCells里面的按钮注册了TouchUpInside-tap,即使UICollectionView仍在减速,这听起来像你遇到的类似问题 . 我创建了一个UIButton子类,它覆盖beginTrackingWithTouch:withEvent,如果包含的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];
    }
    
  • 1

    你需要子类化scrollView(collectionView或tableView)并覆盖

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

    }

    swift

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

    这就是现在你可以滚动按钮而不会丢失按钮点击事件 .

  • 0

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

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

    你试过吗?

相关问题