安全區(qū)域(Safe Area)
在iOS11以前, 自定義UIViewController時, 從來沒有考慮過topLayoutGuide和bottomLayoutGuide這兩個屬性.但是在iOS11出來之后,這兩個屬性被廢棄,取而代之的就是safeArea的概念,safeArea是描述你的視圖部分不被任何內(nèi)容遮擋的方法。 它提供兩種方式:safeAreaInsets或safeAreaLayoutGuide來提供給你safeArea的參照值,即 insets 或者 layout guide。 safeArea區(qū)域如圖所示:

在除了iPhone X以外的型號手機上, UINavigationController 就是 topLayoutGuide區(qū)域. UITabBarController就是bottomLayoutGuide.但是這兩個屬性在iOS11已經(jīng)被取代了. 取而代之的就是safeArea區(qū)域(iPhone X圖區(qū)域4部分)
當(dāng)我們自定義一個UIViewController, 內(nèi)部嵌套了UINavigationController 或者UITabBarController的時候. 運行程序會出現(xiàn)以下錯誤:

原因是少了:

具體是為什么,沒有細研究.不過解決辦法如下:

因為我是創(chuàng)建的空項目所以只有LaunchScreen.storyboard..如果你的項目里還有Main.storyboard,那么 你需要把第四個勾勾也去掉.
iPhone X 豎屏UINavigationController和UITabBarController尺寸問題

區(qū)域一: 高度30
區(qū)域二:高度14
區(qū)域三:高度44
區(qū)域五:高度49
區(qū)域六:高度14
區(qū)域七:高度20
iOS橫屏UITabBarController
更新iOS11以后, UITabBarController上的圖標(biāo)文字由原來的垂直放置, 變成水平放置
iPhone X 橫屏UINavigationController和UITabBarController尺寸問題

iPhone X 橫豎屏在尺寸上有很多細微的差別.

我們打印UINavigationController ?navigationBar的時候發(fā)現(xiàn)他的高度為44.也就是上圖綠色區(qū)域.但是在實際顯示的時候確實紅色區(qū)域,高度為32.整個高度向上12.也就是藍色區(qū)域.

我們打印UITabBarController? tabBar的時候發(fā)現(xiàn)他的高度為32,就是橘色區(qū)域,紅色區(qū)域為功能區(qū),高度為21.我們是何止tabBar顏色的時,包括橘色區(qū)和紅色區(qū).
控制大標(biāo)題的顯示
待更新
屏幕未充滿?底部tabbar留白
解決方案: 準備一張尺寸:1125 * 2436的啟動圖片,? 添加到Assret中
iOS11導(dǎo)航欄自定義按鈕偏移問題
解決方案: 通過改變按鈕的 contentEdgeInsets和imageEdgeInsets的值成功改變了按鈕的偏移問題,單獨設(shè)置contentEdgeInsets也可達到一定的效果。

UITableview UICollectionView MJRefresh下拉刷新錯亂
解決方案:iOS11棄用了automaticallyAdjustsScrollViewInsets屬性,新增contentInsetAdjustmentBehavior來替代它
關(guān)于iPhone X 橫豎屏切換時,UI適配錯誤
- (void)createView:(BOOL)useForRendering showRightAway:(BOOL)showRightAway;
{
? ? if(_view == nil)
?? ?{
? ? ? ? NSString *deviceVersion = [self getDeviceVersion];
? ? ? ? if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])
? ? ? ? {
? ? ? ? ? ? CGRect bounds = CGRectMake(34, 0, 744, 375);
? ? ? ? ? ? _window? = [[UIWindow alloc] initWithFrame:bounds];
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? _window = [[UIWindow alloc] initWithFrame: _screen.bounds];
? ? ? ? }
? ? ? ? _window.screen = _screen;
? ? ? ? if(_screen == [UIScreen mainScreen])
? ? ? ? {
?? ? ? ? ? ?_view = [[GetAppController() init] unityView];
? ? ? ? ? ? NSAssert([_view isKindOfClass:[UnityView class]], @"You MUST use UnityView subclass as unity view");
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? _view = [(useForRendering ? [UnityRenderingView alloc] : [UIView alloc]) initWithFrame: _screen.bounds];
? ? ? ? }
? ? ? ? _view.contentScaleFactor = UnityScreenScaleFactor(self.screen);
? ? ? ? [self updateScreenSize];
? ? ? ? if(showRightAway)
? ? ? ? {
? ? ? ? ? ? [_window addSubview:_view];
? ? ? ? ? ? [_window makeKeyAndVisible];
? ? ? ? }
? ? }
}
- (NSString*)getDeviceVersion
{
? ? struct utsname systemInfo;
? ? uname(&systemInfo);
? ? NSString *deviceVersion = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
? ? NSLog(@"添加獲取手機型號方法 ++ %@", deviceVersion);
? ? return deviceVersion;
}
- (void)updateScreenSize
{
? ? CGSize layerSize? ? = _view.layer.bounds.size;
? ? NSString *deviceVersion = [self getDeviceVersion];
? ? if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])
? ? {
? ? ? ? layerSize = CGSizeMake(744, 375);
? ? }
? ? CGFloat scale? ? ? = UnityScreenScaleFactor(_screen);
? ? _screenSize = CGSizeMake(layerSize.width * scale, layerSize.height * scale);
}