在UITableViewCell或者其他View里嵌套使用CollectionView场景里,如何在点击CollectionView空白或者没有补全cell的地方,将点击事件传递下去,即TableView的DidSelected的代理方式上面?
需要实现的效果:
方法1:在部分场景下,我们空白很小,最多的是:没有不全的Cell的位置点击没有反应。
这种情况我们可以补一个空的UICollectionViewCell,将UICollectionViewCell的点击事件通过代理传递出去。也可以手动修改UICollectionView的frame,或者通过贝塞尔曲线绘制边界,但是比较麻烦。
方法2:添加手势。
给UICollectionView加手势,但是UICollectionview的didselect 事件会和手势冲突。
我们可以通过手势的代理解决这个问题:
func addGes() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(collectionViewClick))
tapGesture.delegate = self
self.collectionView.addGestureRecognizer(tapGesture)
}
@objc private func collectionViewClick() {
self.delegate?cellCollectionViewClick(self)
}
class JPDynamicBottomItemView: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
// 当前collectionCell上是图片,那么点击图片就不需要相应手势
if let view = touch.view, view.isKind(of: UIImageView.self) {
return false
}
return true
}
}
方法3:利用响应链,让事件传递到tableview上
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if let view = super.hitTest(point, with: event) {
if view.isKind(of: UICollectionView.self) {
return self
}
}
return super.hitTest(point, with: event)
}