21

我有一个UICollectionView水平滚动显示UICollectionViewCell一次。每个UICollectionViewCell都有一个垂直滚动UIScrollView的子视图,用于滚动单元格的内容。仅 90% 左右的内部部分UICollectionViewCell被覆盖UIScrollView- 即电池的外框未被覆盖。

事实证明,取消委托UICollectionViewCell所涵盖的部分。因此,当在该方法内发生简单的点击时,不会调用此方法,而如果点击发生在单元格的外部,即在 之外,调用此方法。UIScrollViewUICollectionViewdidSelectItemAtIndexPathUIScrollViewUIScrollView

关于如何实现设置的任何建议,didSelectItemAtIndexPath即使点击发生在UIScrollView?

4

4 回答 4

36

我发现最有效的方法是窃取、panGestureRecognizer暴露UIScrollView和禁用userInteractionscrollView这样,您可以获得滚动视图的行为,但保持集合视图上的交互。在您的UICollectionViewCell子类上:

self.scrollView.userInteractionEnabled = NO;
[self.contentView addGestureRecognizer:self.scrollView.panGestureRecognizer];

这是 Apple 在 WWDC 2014 session 235(高级滚动视图和触摸处理技术)中推荐和演示的方法

于 2014-07-20T18:28:21.123 回答
6

这是一个 UIScrollView 子类方法,它维护单元格选择功能,还允许在滚动视图内外进行 UIControl 选择(按钮等)。

斯威夫特 3

class CellContentScrollView: UIScrollView {

  override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    let hitTargetView = super.hitTest(point, with: event)
    return hitTargetView as? UIControl ?? (hitTargetView == self ? nil : superview)
  }

  override func didMoveToSuperview() {
    superview?.addGestureRecognizer(panGestureRecognizer)
  }

}

斯威夫特 2

class CellContentScrollView: UIScrollView {

    // MARK: - UIView override

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
        let hitTargetView = super.hitTest(point, withEvent: event)
        return hitTargetView as? UIControl ?? (hitTargetView == self ? nil : superview)
    }

    override func didMoveToSuperview() {
        superview?.addGestureRecognizer(panGestureRecognizer)
    }
}

Objective-C

@implementation CellContentScrollView

    #pragma mark - UIView override

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
        UIView *hitTargetView = [super hitTest:point withEvent:event];

        if ([hitTargetView isKindOfClass:UIControl.class]) {
            return hitTargetView;
        } else if (hitTargetView != self) {
            return self.superview;
        }

        return nil;
    }

    - (void)didMoveToSuperview {
        [self.superview addGestureRecognizer:self.panGestureRecognizer];
    }

@end
于 2016-04-12T12:21:42.087 回答
1

点击UIScrollView用于查看是否应该进行滚动。

您应该单击 UIScrollView本身并将其传递给周围的UICollectionViewCell.

于 2013-01-12T23:00:21.273 回答
0

将点击手势添加到您的超级视图

override func viewDidLoad() {
        super.viewDidLoad()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTapView(gesture:)))
        view.addGestureRecognizer(tapGesture)
    }

@objc func didTapView(gesture: UITapGestureRecognizer) {
    view.endEditing(true)
    let touchLocation:CGPoint = gesture.location(ofTouch: 0, in: self.collectionView)
    let indexPath = self.collectionView.indexPathForItem(at: touchLocation)
    if indexPath != nil {
        let cell = self.collectionView.cellForItem(at: indexPath!)
        if (cell?.isSelected)! {
            //PREFORM DESELECT
        } else {
            //PREFORM SELECT HERE
        }
    }
} 
于 2018-10-21T11:20:41.483 回答