說(shuō)明: 目前調(diào)整的項(xiàng)目是基于純代碼構(gòu)建.
整體調(diào)整
由于項(xiàng)目是基于 UITabBarController + UINavigationController 搭建的, 所以整體的 UI 適配包括兩部分. 首先, 基于 UITabBarController 的幾個(gè)主頁(yè)面的高度是實(shí)際的屏幕高度, 其次, 其它子頁(yè)面的高度為: 實(shí)際屏幕的高度 - 34 . 這樣子頁(yè)面底部就留出了 34 的安全距離.
一、UITabBarController 高度
// _SCREEN_HEIGHT 為實(shí)際屏幕高度
tabBarCtrl.view.frame = CGRectMake(0, 0, GET_CUR_DEVICE_WIDTH, _SCREEN_HEIGHT);
二、宏定義
iPhoneX 的適配主要是高度的適配, StatusBar 相關(guān)調(diào)整 . 主要是在 GlobalMacro.h 中定義以下宏來(lái)兼容處理.
#define iPhoneX_HEIGHT 812
#define iPhoneX (_SCREEN_HEIGHT == iPhoneX_HEIGHT)
#define UISCREEN_HEIGHT (iPhoneX ? ([[UIScreen mainScreen] bounds].size.height-34) : ([[UIScreen mainScreen] bounds].size.height))
#define _STATUS_BAR_HEIGHT (iPhoneX ? 44 : 20)
#define iPhoneXSafeDelta (iPhoneX ? 34 : 0) // 用于其它特殊頁(yè)面調(diào)整
-
高度的適配
原理: 通過(guò)宏 iPhoneX 判定是否是 iPhoneX 設(shè)備, 然后作相應(yīng)處理.- iPhoneX: UISCREEN_HEIGHT = 實(shí)際屏幕的高度 - 34
- 其它: UISCREEN_HEIGHT = 實(shí)際屏幕的高度
StatusBar
StatusBar 主要是高度的調(diào)整, iPhoneX 為 44 , 其它設(shè)備 20.TabBar 線條處理
首頁(yè) tabBarCtrl 的 tabBar 默認(rèn)高度為 83 , 原來(lái) tabBar 的背景圖高度只有 49, 所以會(huì)出現(xiàn)一條線條.
解決: 將 TabBar 的背景圖片拉伸
UIImage *imamge = [UIImage imageFileNamed:@"tabNewBar"];
[tabBarCtrl.tabBar setBackgroundImage:[imamge stretchableImageWithLeftCapWidth:20 topCapHeight:20]];
三症昏、適配后的頁(yè)面
啟動(dòng)圖, 引導(dǎo)圖替換
原有尺寸不能滿足要求, 需提供尺寸為 1125px × 2436px 的圖片. 否則啟動(dòng)出現(xiàn)上下有黑條的情況.
啟動(dòng)圖片代碼更改
iPhone X 對(duì)應(yīng)的啟動(dòng)圖名稱為"LaunchImage-1100-Portrait-2436h@3x.png".
if (iPhoneX) launchImageName = @"LaunchImage-1100-Portrait-2436h@3x.png";
根據(jù)狀態(tài)欄獲取網(wǎng)絡(luò)狀態(tài)
iPhone X 的狀態(tài)欄發(fā)生了很大變化, 原來(lái)通過(guò)方法 getNetWorkStates 獲取網(wǎng)絡(luò)狀態(tài)已經(jīng)失效. 也曾試圖通過(guò) runtime 去獲取, 但最終以失敗告終. 目前的處理方式是做兼容處理, iPhone X 使用三方框架 RealReachability , 其它設(shè)備還是沿用以前的方式.
+(NSString *)getNetWorkStates
{
UIApplication *app = [UIApplication sharedApplication];
NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
NSString *state = @"-1";
int netType = 0;
//獲取到網(wǎng)絡(luò)返回碼
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
//獲取到狀態(tài)欄
netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];
switch (netType) {
case 0:
//無(wú)網(wǎng)模式
state = @"-1";
[NSGlobe getEngine].netStatus = NotReachable;
break;
case 1:
state = @"2G";
[NSGlobe getEngine].netStatus = ReachableVia2G;
break;
case 2:
state = @"3G";
[NSGlobe getEngine].netStatus = ReachableVia3G;
break;
case 3:
state = @"4G";
[NSGlobe getEngine].netStatus = ReachableVia4G;
break;
case 4:
state = @"LTE";
[NSGlobe getEngine].netStatus = ReachableViaLTE;
break;
case 5:
state = @"WIFI";
[NSGlobe getEngine].netStatus = ReachableViaWiFi;
break;
default:
break;
}
break;
}
}
return state;
}
字體變大
使用 UITableViewCell 時(shí)沒(méi)有設(shè)置 font
iPhone X Push過(guò)程中TabBar位置上移
在UINavigationController的基類(lèi)重寫(xiě)pushViewController代理方法,在Push的時(shí)候修正一下TabBar的frame
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.viewControllers.count > 0) {
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
// 修改tabBra的frame
CGRect frame = self.tabBarController.tabBar.frame;
frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
self.tabBarController.tabBar.frame = frame;
}
使用新編譯器時(shí)無(wú)法識(shí)別自定義宏
Xcode 9 ,使用 new build system 時(shí) pch 文件無(wú)法識(shí)別其中導(dǎo)入的頭文件, 暫時(shí)未找到解決辦法.