適用iOS11和iPhoneX的一些變化
前陣子項目開發忙成狗,就一直沒做iOS11的適配,直到XcodeGM版發布后,我胸有成竹的在iPhoneX上跑起項目,整個人都涼透了。。.下面總結一下我遇到的坑,不是很全面,日后補充。
導航欄
導航欄高度的變化
iOS11之前導航欄默認高度為64pt(這里高度指statusBar + NavigationBar),iOS11之后如果設置了prefersLargeTitles = YES則為96pt,默認情況下還是64pt,但在iPhoneX上由于劉海的出現statusBar由以前的20pt變成了44pt,所以iPhoneX上高度變為88pt,如果項目里隱藏了導航欄加了自定義按鈕之類的,這里需要注意適配一下。
導航欄圖層及對titleView布局的影響
iOS11之前導航欄的title是添加在UINavigationItemView上面,而navigationBarButton則直接添加在UINavigationBar上面,如果設置了titleView,則titleView也是直接添加在UINavigationBar上面。iOS11之后,大概因為largeTitle的原因,視圖層級發生了變化,如果沒有給titleView賦值,則titleView會直接添加在_UINavigationBarContentView上面,如果賦值了titleView,則會把titleView添加在_UITAMICAdaptorView上,而navigationBarButton被加在了_UIButtonBarStackView上,然后他們都被加在了_UINavigationBarContentView上,如圖:
所以如果你的項目是自定義的navigationBar,那么在iOS11上運行就可能出現布局錯亂的bug,解決辦法是重寫UINavigationBar的layoutSubviews方法,調整布局,上代碼:
- (void)layoutSubviews { [super layoutSubviews]; //注意導航欄及狀態欄高度適配 self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), naviBarHeight); for (UIView *view inself.subviews) {if([NSStringFromClass([view class]) containsString:@“Background”]) {view.frame = self.bounds; } elseif ([NSStringFromClass([view class])containsString:@“ContentView”]) { CGRectframe = view.frame;frame.origin.y = statusBarHeight; frame.size.height =self.bounds.size.height - frame.origin.y; view.frame = frame; } }}
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
適用iOS11和iPhoneX的一些變化下載
相關電子資料下載
- iOS17.1可能明天發布,iOS17.1主要修復哪些問題? 376
- 華為全新鴻蒙蓄勢待發 僅支持鴻蒙內核和鴻蒙系統應用 719
- 蘋果手機系統iOS 17遭用戶質疑 731
- iPhone12輻射超標?蘋果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標明年智能手機出貨7000萬部;消息稱 MiOS 僅限國內,小米 28208
- 蘋果推送iOS17.0.3,解決iPhone15Pro系列存在機身過熱 216
- Testin云測兼容和真機服務平臺中上線iPhone 15系列手機 208
- 利爾達推出搭載HooRiiOS的Matter模組 145
- 運放參數解析:輸入偏置電流(Ibias)和失調電流(Ios) 128
- 昆侖太科發布支持國產飛騰騰銳D2000芯片的開源BIOS固件版本 448