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

不知道为什么图片总是上传失败 如果有需要去我的小站看吧!!!!!简书最近有点抽风啊

iOS 11通用相关

Edge Protect

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

[图片上传失败...(image-30eb96-1518080414937)]

虽然苹果用黑体字写着强烈不建议开发者干涉系统的手势,但是为了增强用户体验还是开出了接口,苹果管这个叫做 "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是否延迟执行系统手势。

[图片上传失败...(image-96b904-1518080414937)]

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手势的,但是当用户误触到边界的时候还是会稍稍影响体验,尤其是在全屏模式下、相机、视频、游戏等

    [图片上传失败...(image-832295-1518080414937)]

  • Edge Protent

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

-(UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}

[图片上传失败...(image-c842f2-1518080414937)]

setNeedsUpdateOfScreenEdgesDeferringSystemGestures

这个方法是在应用内部动态控制edge protect,我们可以在上个方法中返回一个BOOL变量,然后根据需要改变该变量的值,然后调用该方法进行刷新。

[图片上传失败...(image-179588-1518080414937)]

iPhone X使用相关

iPhone X在系统手势上面交互和其他设备还是有一定区别的,因为加入了Home Indicator的原因,引入了新的手势,同时对以往的手势也做了相应的调整。

iPhone X Edge Protect

在iPhone X 中通知中心和控制中心全部都移动到了由顶部刘海处下拉和右上角下拉来触发。原本底部的所有手势都被Home Indicator占用。其实Edge Protect在这里依然适用,只是对于Home Indicator的手势有一个小插曲。正常来说他在底部,就应该受到UIRectEdgeBottom 或者是 UIRectEdgeAll控制,但是一开始苹果并没有这么做,不论怎么写代码,他都有着最高的优先级,在iPhone X刚发布我就试图去处理交互问题,因为海报工厂并没有传统的UITabBarController,且里面所有的tableView都是直通到底,但是始终都无法延迟执行与Home Indicator相关的任何手势。

[图片上传失败...(image-e2df61-1518080414937)]

后来看了其他游戏,视频类App在iPhone X上的表现也都是如此。腾讯的王者荣耀,网易的吃鸡都是一样。腾讯官方给出的解释是暂时开起引导式访问,也仍然不方便。后来在今年1月25日苹果推送了iOS 11.2.5的版本更新,然后王者荣耀也跟着进行了一波更新,在进入游戏时候就会发现,底部的Home Indicator当你一段时间不去触碰它的时候由黑色或者白色(根据当前的屏幕显示的内容来决定)变成非常透明的灰色,当你第一次进行操作会默认执行App内手势,同时激活Home Indicator,短时间内进行第二次操作就可以返回桌面

[图片上传失败...(image-343abc-1518080414937)]

一开以为是有新的API出现,不过看了交互文档并没有新的东西,而且小版本的系统更新应该也不会出现新的东西。所以找到了之前的edge protect 代码运行后确实可以达到效果。对于视频,游戏等App,确实可以起到很好的防误触的效果。遗憾的是并没有太多的人使用这个功能。目前主流的大型游戏,包括Gameloft出品的游戏都没做相应的处理。

[图片上传失败...(image-3966df-1518080414937)]

iPhone X Home Indicator Hidden

如果说上面的Edge Protect适合在游戏中使用,那么Home Indicator Hidden则更适合在非游戏环境下增强App的沉浸感,尤其是全屏视屏播放、录制的时候。同样三个API,和Edge protect的用法完全一样。

// Override to return a child view controller or nil. If non-nil, that view controller's home indicator auto-hiding will be used. If nil, self is used. Whenever the return value changes, -setNeedsHomeIndicatorAutoHiddenUpdate should be called.
- (nullable UIViewController *)childViewControllerForHomeIndicatorAutoHidden API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);

// Controls the application's preferred home indicator auto-hiding when this view controller is shown.
- (BOOL)prefersHomeIndicatorAutoHidden API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);

// This should be called whenever the return values for the view controller's home indicator auto-hiding have changed.
- (void)setNeedsUpdateOfHomeIndicatorAutoHidden API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);

上面写的是自动隐藏,也就是说系统会根据当时的使用情况来进行显示或者隐藏,而不是永久的隐藏掉,实际测试发当界面两秒内没有进行任何交互操作的时候Home Indicator会逐渐隐去,直达屏幕上出现了点击的操作,注意是点击,TableView的滑动并不能触发显示,不过只是是隐藏,但是手势依然可以使用。

[图片上传失败...(image-51e7ac-1518080414938)]

如果是feed流界面搭配酷一点的UI就会提高沉浸感,比如这样:

[图片上传失败...(image-70ee2e-1518080414938)]

有的人可能会问如果说点击的手势会触发它再次显示那我获取window上的交互每次在它即将显示的时候通过setNeedsUpdateOfHomeIndicatorAutoHidden在让他隐藏不就好了吗?这样一来既不影响系统手势也不会让它在显示出来,其实我自己试过不行的,毕竟苹果不会让你这样改。

坑点

需要注意的是:prefersHomeIndicatorAutoHidden和preferredScreenEdgesDeferringSystemGestures不可一起使用,如果一起使用的话后者是不生效的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 143,906评论 1 305
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,698评论 1 257
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 95,242评论 0 213
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 41,257评论 0 182
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 49,076评论 1 260
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,912评论 1 178
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,509评论 2 274
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,255评论 0 168
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 29,145评论 6 235
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,613评论 0 214
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,376评论 2 216
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,733评论 1 231
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,287评论 0 32
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,196评论 2 213
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,644评论 3 211
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,651评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,059评论 0 169
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,644评论 2 233
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,789评论 2 237

推荐阅读更多精彩内容