美文网首页
ios swift 解决屏幕左侧的按钮与系统事件冲突

ios swift 解决屏幕左侧的按钮与系统事件冲突

作者: biubiubiuCOWARD | 来源:发表于2019-03-26 11:45 被阅读0次

最近在写项目中遇到一系列问题。

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
        }
}

相关文章

网友评论

      本文标题:ios swift 解决屏幕左侧的按钮与系统事件冲突

      本文链接:https://www.haomeiwen.com/subject/ecxgvqtx.html