最近在写项目中遇到一系列问题。
1. UICollectionView上的cell点击高亮效果延迟显示
2. UICollectionView上最左侧的cell和系统的手势冲突,造成延迟显示
虽然这两种问题所造成的影响效果是一致的,但是造成的原因以及解决方法不尽相同。
先上图吧上图是第二个问题效果图,绿框中的区域是延迟区域,并不会立刻响应点击效果,其他cell都可以做出立即的响应。第一个问题的效果就是所有的cell都不会立即响应点击效果。
解决方案
1. 第一种问题的原因是 iOS 7+系统 ,手触摸到屏幕后系统会有 150ms的时间去反应并判断,你是否是正常点击和不经意间的点击。手触摸屏幕时间超过 150ms UIScrollView 才会把触摸事件分发给各个子视图。否则,会被其拦截。所以将其延迟属性(delaysContentTouches)设为false即可解决。
2. 第二中问题的原因是在屏幕的左侧有系统的返回手势,和你点击的手势产生了冲突,在系统中手势的优先级要大于点击事件。所以要做的就是拦截系统手势。
首先遵循手势代理
self.navigationController?.interactivePopGestureRecognizer?.delegate = self
其次实现代理方法
// 为了解决屏幕左侧的按钮和系统的手指产生冲突
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
// 如果点击是按钮,就不再接受系统的手势
if touch.view?.tag == 100000_10 {
return false
}
return true
}
到这里才完成了一般的工作,因为UIViewController中有一个属性叫做preferredScreenEdgesDeferringSystemGestures,它返回的是屏幕中处理事件优先级的方位,为了保证屏幕左侧和右侧的处理效果一致,需要让其优先响应屏幕左侧的事件。
// 为了解决屏幕左侧的按钮和右侧的按钮反应时间不一致,让其优先响应屏幕左侧的事件
override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
get {
return .left
}
}