Unity適配iPhone X---關於Home鍵指示器適配

weixin_34321977發表於2018-04-08
1753433-7e2a4ad74d413e24.jpg
Unity攤

相信有些人在iPhone X上玩遊戲的時候,總是誤觸底部白條(Home鍵指示器,暫且先叫“底部白條”),專業術語:“App需要有從狀態列下拉或底部欄上滑的操作,而這個會和系統的下拉或上滑調出通知中心手勢衝突。” 。 於是開始 百度一下

1753433-e3d898baebb47f7e.jpg
這是什麼鬼

這並不是我們想要的解決辦法....... how to 辦?

經過一系列的嘗試, 在iOS11之後iOS增加的新的API,是關於解決手勢衝突的問題。

@interface UIViewController (UIScreenEdgesDeferringSystemGestures)

// 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);

@end

API我們知道了,可是加到哪裡?然後通過分析Unity打包後的Xcode工程,在工程目錄

Classes->UI->UnityViewControllerBaseiOS.mm

的指令碼中,發現被重寫的方法,如下:

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    UIRectEdge res = UIRectEdgeNone;
if(UnityGetDeferSystemGesturesTopEdge())
    res |= UIRectEdgeTop;
if(UnityGetDeferSystemGesturesBottomEdge())
    res |= UIRectEdgeBottom;
if(UnityGetDeferSystemGesturesLeftEdge())
    res |= UIRectEdgeLeft;
if(UnityGetDeferSystemGesturesRightEdge())
    res |= UIRectEdgeRight;
return res;
}

我們只需要改成如下即可:

UIRectEdge res = UIRectEdgeNone;
//if(UnityGetDeferSystemGesturesTopEdge())
    //res |= UIRectEdgeTop;
//if(UnityGetDeferSystemGesturesBottomEdge())
    //res |= UIRectEdgeBottom;
//if(UnityGetDeferSystemGesturesLeftEdge())
    //res |= UIRectEdgeLeft;
//if(UnityGetDeferSystemGesturesRightEdge())
    //res |= UIRectEdgeRight;
    return UIRectEdgeAll;

設定後第一次下拉“底部白條”只會展示指示器,繼續下拉才能將通知中心拉出來。如果返回UIRectEdgeNone則會直接下拉出來。

參考部落格,給大家安利一下,寫的非常棒!:

iPhoneX 適配實踐

PS: 如有疑問可以留言,一起學習。

相關文章