β

关于iPhone X下Home键的隐藏和延迟响应

Harries Blog™ 31 阅读

iOS 11通用相关

Edge Protect

iPhone X 刚出来的时候 苹果 第一 时间 更新了新设备的交互文档,其中针对了大家最关心的“系统手势和 App 自带手势冲突”的问题也给出了相应的解决办法:

关于iPhone X下Home键的隐藏和延迟响应

虽然苹果用黑体字写着强烈不建议 开发者 干涉系统的手势,但是为了增强用户体验还是开出了接口,苹果管这个叫做 “edge protect” 因为进入App后系统手势都是从边缘触发,引起冲突的地方也会是在边缘中。

根据官方文档描述,在冲突区域第一次执行手势的时候会优先触发App的内部手势,当短时间内再次进行同样的操作则会触发系统手势。也就是将系统手势延迟到下一次执行。

API Discussion

根据官方文档找到对应的API

// Override to return a child view controller or nil. If non-nil, that view controller's screen edges deferring system gestures will be used. If nil, self is used. Whenever the return value changes, -setNeedsScreenEdgesDeferringSystemGesturesUpdate should be called.
- (nullable UIViewController *)childViewControllerForScreenEdgesDeferringSystemGestures API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);
// Controls the application's preferred screen edges deferring system gestures when this view controller is shown. Default is UIRectEdgeNone.
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);
// This should be called whenever the return values for the view controller's screen edges deferring system gestures have changed.
- (void)setNeedsUpdateOfScreenEdgesDeferringSystemGestures API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);

childViewControllerForScreenEdgesDeferringSystemGestures

该方法是用来控制子试图控制器是否允许 开发 者控制edge protect的开启或是关闭。如果实现了这个方法并且返回值不为空那么子VC的edge protect设置就会遵循父VC的设置,跟随父VC是否延迟执行系统手势。

关于iPhone X下Home键的隐藏和延迟响应

preferredScreenEdgesDeferringSystemGestures

该方法是设置edge protect的方法,返回值是一个边界的枚举

typedef NS_OPTIONS(NSUInteger, UIRectEdge) {
    UIRectEdgeNone   = 0,
    UIRectEdgeTop    = 1 << 0,
    UIRectEdgeLeft   = 1 << 1,
    UIRectEdgeBottom = 1 << 2,
    UIRectEdgeRight  = 1 << 3,
    UIRectEdgeAll    = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight
} NS_ENUM_AVAILABLE_IOS(7_0);

因为不论我们从shang、左、下、右边都可触发系统手势,所以方法保护了四个边框,将边界触发的手势延迟执行,这个方法从iOS11开始使用,不过枚举中虽然有左右的边界保护,但是系统手势中还不清楚左右滑动会触发什么效果,实验发现对于VC的左边界右滑动pop手势是无效的,也就是说这个pop手势一直有着最高的优先级。不过上下就很好理解,底部上拉出控制中心,顶部下拉是通知中心。

当不做任何限制时候在顶部和底部很容易触发到系统的手势,他们会优先于Tab.eView的scroll手势执行,虽说屏幕大部分的界面还是执行TableView手势的,但是当用户误触到边界的时候还是会稍稍影响体验,尤其是在全屏模式下、相机、视频、游戏等

关于iPhone X下Home键的隐藏和延迟响应

在对应的ViewControll中添加如下 代码 ,我们这边开启的是所有边界限制其中包括了上、下边界。在下拉或者上拉的话会先触发App内部手势,同时出现一个小箭头然后在箭头消失之前再次滑动就会触发系统手势。

-(UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}
作者:Harries Blog™
追心中的海,逐世界的梦
原文地址:关于iPhone X下Home键的隐藏和延迟响应, 感谢原作者分享。

发表评论