转载并整理自: https://juejin.im/post/6844903561298444295#heading-1
Edge Protect
苹果非常不建议开发者干涉系统手势,但是为了增强用户体验开放了“edge protect”,用来处理屏幕边缘的手势冲突。
冲突区域第一次执行手势的时候会有限触发app的内容手势,短时间再有相同的操作就会触发系统手势。即,系统手势经延迟到下一次执行。
API
- (nullable UIViewController *)childViewControllerForScreenEdgesDeferringSystemGestures API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);
- (void)setNeedsUpdateOfScreenEdgesDeferringSystemGestures API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);
- childViewControllerForScreenEdgesDeferringSystemGestures
返回childViewControllers中比系统手势优先级更高的子控制器。
在实现Contrainer view controller时,如果子控制器定义了优先于系统手势的屏幕边缘手势,那么就需要重写这个方法。
- preferredScreenEdgesDeferringSystemGestures
因为不论我们从shang、左、下、右边都可触发系统手势,所以方法保护了四个边框,将边界触发的手势延迟执行,这个方法从iOS11开始使用,不过枚举中虽然有左右的边界保护,但是系统手势中还不清楚左右滑动会触发什么效果,实验发现对于VC的左边界右滑动pop手势是无效的,也就是说这个pop手势一直有着最高的优先级。不过上下就很好理解,底部上拉出控制中心,顶部下拉是通知中心。
UIRectEdgeNone: 系统手势优先
UIRectEdgeAll: 触发屏幕手势后后会先显示小箭头,然后下次滑动就会触发系统手势
- setNeedsUpdateOfScreenEdgesDeferringSystemGestures
策略修改时,要手动触发下此方法进行更新。
Home Indicator Hidden
自动隐藏Home Indicator
- (nullable UIViewController *)childViewControllerForHomeIndicatorAutoHidden API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);
- (BOOL)prefersHomeIndicatorAutoHidden API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);
- (void)setNeedsUpdateOfHomeIndicatorAutoHidden API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);
上面写的是自动隐藏,也就是说系统会根据当时的使用情况来进行显示或者隐藏,而不是永久的隐藏掉,实际测试发当界面两秒内没有进行任何交互操作的时候Home Indicator会逐渐隐去,直达屏幕上出现了点击的操作,注意是点击,TableView的滑动并不能触发显示,不过只是是隐藏,但是手势依然可以使用。
坑点
需要注意的是:prefersHomeIndicatorAutoHidden和preferredScreenEdgesDeferringSystemGestures不可一起使用,如果一起使用的话后者是不生效的。