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

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

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 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,259评论 4 61
  • KIN 225 自我存在的红蛇 Red Self-Existing Serpent 公元 2018/1/3(三) ...
    心明丽阅读 367评论 0 1
  • 文/梓星 七岁那年 我还是扎着麻花辫 穿着碎花裙的小姑娘 月光下我会追着自己的影子跑 却怎么也追不到 十七岁那年 ...
    梓莘阅读 237评论 3 10
  • 还记得当初,是一个急刹车式的工作低潮,工作上的挫败,心里低迷是不用说的。 工作没有失误,公司也没有任何亏损,我,被...
    安晴兰阅读 548评论 0 0