亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳解iOS11、iPhone X、Xcode9 適配指南

2020-07-26 02:40:53
字體:
來源:轉載
供稿:網友

更新iOS11后,發現有些地方需要做適配,整理后按照優先級分為以下三類:

  • 單純升級iOS11后造成的變化;
  • Xcode9 打包后造成的變化;
  • iPhoneX的適配

一、單純升級iOS11后造成的變化

升級后,發現某個擁有tableView的界面錯亂,組間距和contentInset錯亂,因為iOS11中 UIViewController 的 automaticallyAdjustsScrollViewInsets 屬性被廢棄了,因此當tableView超出安全區域時,系統自動會調整SafeAreaInsets值,進而影響adjustedContentInset值

// 有些界面以下使用代理方法來設置,發現并沒有生效- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;// 這樣的原理是因為之前只是實現了高度的代理方法,卻沒有實現View的代理方法,iOS10及以前這么寫是沒問題的,iOS11開啟了行高估算機制引起的bug,因此有以下幾種解決方法:// 解決方法一:添加實現View的代理方法- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {  return nil;}- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {  return nil;}// 解決方法二:直接使用tableView屬性進行設置,修復該UI錯亂self.tableView.sectionHeaderHeight = 0;self.tableView.sectionFooterHeight = 5;[_optionTableView setContentInset:UIEdgeInsetsMake(-35, 0, 0, 0)];// 解決方法三:添加以下代碼關閉估算行高self.tableView.estimatedRowHeight = 0;self.tableView.estimatedSectionHeaderHeight = 0;self.tableView.estimatedSectionFooterHeight = 0;

四、使用Xcode9 編譯后發現的問題

1. 發現“fastSocket”第三方報錯,具體原因是缺少C99的頭文件,引入“#include <sys/time.h>”即可


2. 導航欄的新特性

原生的搜索欄樣式發生改變


右邊為iOS11樣式,搜索區域高度變大,字體變大

查看 API 后發現,iOS11后將 searchController 賦值給了 NavigationItem,通過屬性 hidesSearchBarWhenScrolling 可以控制搜索欄是否在滑動的時候進行隱藏和顯示

// A view controller that will be shown inside of a navigation controller can assign a UISearchController to this property to display the search controller's search bar in its containing navigation controller's navigation bar.@property (nonatomic, retain, nullable) UISearchController *searchController API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);// If this property is true (the default), the searchController's search bar will hide as the user scrolls in the top view controller's scroll view. If false, the search bar will remain visible and pinned underneath the navigation bar.

另外,UINavigationBar 新增屬性 BOOL值 prefersLargeTitles 來實現下面的效果,并可以通過 largeTitleTextAttributes 來設置大標題的文本樣式

有個界面使用到了導航欄按鈕相關的frame,也發生了UI錯亂,查看UI層級關系后發現,iOS11以前是直接把按鈕加到了UINavigationBar上面,而iOS11則是先將按鈕加到了_UITAMICAdaptorView,再加到_UIButtonBarStackView、_UINavigationBarContentView,接著才是UINavigationBar。因此如果需要獲取導航欄按鈕 frame 或者 superView,這里需要專門做下適配


iOS10及以下版本導航欄按鈕層級關系圖


iOS11導航欄按鈕層級關系圖

三、iPhone X的適配

下載完Xcode9之后,第一件事自然是在 iPhone X(模擬器)上過把癮,然后編譯后就發現報錯了

由于iPhone X的狀態欄是和其他版本手機差異比較大的,因此api 變化也比較大

先后做了以下適配

適配點一:項目中使用狀態欄中圖標判斷當前網絡的具體狀態


出錯代碼

打印的 Log 報出以下錯誤: Trapped uncaught exception 'NSUnknownKeyException', reason: '[<UIStatusBar_Modern 0x7fcdb0805770> valueForUndefinedKey:]: this class is not key value coding-compliant for the key foregroundView.'


iPhone X


其他手機

使用 runtime 打印其所有屬性,發現以下差異

// 測試代碼#import <objc/runtime.h>NSMutableString *resultStr = [NSMutableString string];//獲取指定類的Ivar列表及Ivar個數unsigned int count = 0;Ivar *member = class_copyIvarList([[application valueForKeyPath:@"_statusBar"] class], &count);  for(int i = 0; i < count; i++){  Ivar var = member[i];  //獲取Ivar的名稱  const char *memberAddress = ivar_getName(var);  //獲取Ivar的類型  const char *memberType = ivar_getTypeEncoding(var);  NSString *str = [NSString stringWithFormat:@"key = %s       type = %s /n",memberAddress,memberType];   [resultStr appendString:str];}NSLog(@"%@", resultStr);
// 其他版本的手機key = _inProcessProvider      type = @"<UIStatusBarStateProvider>"key = _showsForeground       type = Bkey = _backgroundView        type = @"UIStatusBarBackgroundView"key = _doubleHeightLabel      type = @"UILabel"key = _doubleHeightLabelContainer  type = @"UIView"key = _currentDoubleHeightText   type = @"NSString"key = _currentRawData        type = {超長。。}key = _interruptedAnimationCompositeViews type = @"NSMutableArray"key = _newStyleBackgroundView    type = @"UIStatusBarBackgroundView"key = _newStyleForegroundView    type = @"UIStatusBarForegroundView"key = _slidingStatusBar       type = @"UIStatusBar"key = _styleAttributes       type = @"UIStatusBarStyleAttributes"key = _waitingOnCallbackAfterChangingStyleOverridesLocally type = Bkey = _suppressGlow         type = Bkey = _translucentBackgroundAlpha  type = dkey = _showOnlyCenterItems     type = Bkey = _foregroundViewShouldIgnoreStatusBarDataDuringAnimation type = Bkey = _tintColor          type = @"UIColor"key = _lastUsedBackgroundColor   type = @"UIColor"key = _nextTintTransition      type = @"UIStatusBarStyleAnimationParameters"key = _overrideHeight        type = @"NSNumber"key = _disableRasterizationReasons type = @"NSMutableSet"key = _timeHidden          type = Bkey = _statusBarWindow       type = @"UIStatusBarWindow"http:// iPhone Xkey = _statusBar ; type = @"_UIStatusBar"http:// 因此可見iPhone X的狀態欄是多嵌套了一層,多取一次即可,最終適配代碼為:NSArray *children;// 不能用 [[self deviceVersion] isEqualToString:@"iPhone X"] 來判斷,因為模擬器不會返回 iPhone X  if ([[application valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {    children = [[[[application valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];  } else {    children = [[[application valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];  }

適配點二:解決這個問題后項目跑起來發現,整個app界面上下各空出大概40pt的高度


經常從 Github 上下載項目把玩的老司機們都知道,有些老項目在模擬器上跑起來之后也會只有 iPhone 4(320*480)的布局空間,造成這個的原因是啟動圖使用 Launch Images Source 設置的時候沒有勾選并設置對應的圖片,解決方法如下


然而iPhone X更大的坑是屏幕的適配

首先看下屏幕尺寸


這張圖反映出不少信息:

  • iPhone X的寬度雖然和7是一樣的,但是高度多出145pt
  • 使用三倍圖是重點,而且一般認為肉眼所能所能識別的最高的屏幕密度是300ppi,iPhone X已達到458ppi(查證發現三星galaxy系列的屏幕密度是522ppi)

在設計方面,蘋果官方文檔human-interface-guidelines有明確要求,下面結合圖例進行說明:


展示出來的設計布局要求填滿整個屏幕

填滿的同時要注意控件不要被大圓角和傳感器部分所遮擋


安全區域以外的部分不允許有任何與用戶交互的控件

上面這張圖內含信息略多

頭部導航欄不予許進行用戶交互的,意味著下面這兩種情況 Apple 官方是不允許的



  • 底部虛擬區是替代了傳統home鍵,高度為34pt,通過上滑可呼起多任務管理,考慮到手勢沖突,這部分也是不允許有任何可交互的控件
  • 狀態欄在非安全區域,文檔中也提到,除非可以通過隱藏狀態欄給用戶帶來額外的價值,否則最好把狀態欄還給用戶

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产拍在线观看| 欧美日韩国产丝袜另类| 国产精品日本精品| 午夜精品视频网站| 精品国产自在精品国产浪潮| 成人综合网网址| 久久人人爽人人爽爽久久| 伊人久久免费视频| 成人精品一区二区三区电影免费| 日韩精品极品毛片系列视频| 精品国产一区二区三区在线观看| 国产一区二区三区视频在线观看| 久久久免费观看| 久热国产精品视频| 久久精品国产亚洲一区二区| 日产精品99久久久久久| 国产精品专区第二| 这里只有精品丝袜| 国产福利成人在线| 亚洲国产天堂网精品网站| 日韩欧美a级成人黄色| 日韩在线观看成人| 成人免费观看网址| 欧美专区福利在线| 国产视频精品xxxx| 91夜夜未满十八勿入爽爽影院| 色综合久久天天综线观看| 国产剧情日韩欧美| 亚洲成在人线av| 欧美在线观看视频| 国产精品女主播| 国产女精品视频网站免费| 日本高清视频精品| 国产日本欧美在线观看| 国产欧美精品一区二区三区介绍| 亚洲精品永久免费| 亚洲国产97在线精品一区| 懂色av中文一区二区三区天美| 欧美成人剧情片在线观看| 欧美在线视频一区| 欧美激情亚洲精品| 中文字幕久久久av一区| 一本色道久久综合亚洲精品小说| 青青久久aⅴ北条麻妃| 国产欧美一区二区三区在线看| 亚洲第一区中文字幕| 成人黄色av播放免费| 亚洲成人国产精品| 久久97久久97精品免视看| 亚洲欧美综合另类中字| 亚洲护士老师的毛茸茸最新章节| 欧美极品少妇全裸体| 日日噜噜噜夜夜爽亚洲精品| 亚洲精品自拍视频| 4p变态网欧美系列| 久久精品2019中文字幕| 久久精品久久久久久国产 免费| 久久精品国产69国产精品亚洲| 亚洲色图15p| 国产精品极品美女在线观看免费| 亚洲一级免费视频| 中文字幕欧美国内| 国产亚洲aⅴaaaaaa毛片| xxx成人少妇69| 日韩亚洲国产中文字幕| 欧美日韩xxx| 欧美日韩国产精品一区二区三区四区| 在线观看久久久久久| 久操成人在线视频| 亚洲成色777777女色窝| 国产精品自产拍在线观看中文| 在线观看日韩www视频免费| 色一区av在线| 精品日本美女福利在线观看| 亚洲成人a**站| 欧美乱人伦中文字幕在线| 亚洲欧美日韩一区二区在线| 在线电影欧美日韩一区二区私密| 久久人人爽亚洲精品天堂| 久久人人爽人人爽爽久久| 庆余年2免费日韩剧观看大牛| 日韩欧美在线观看视频| 亚洲欧美日韩国产中文| 欧美日韩在线观看视频| 欧美性感美女h网站在线观看免费| 欧美精品videosex牲欧美| 97国产精品久久| 青草青草久热精品视频在线观看| 亚洲欧美日韩高清| 久久久久久国产精品久久| 日韩视频免费大全中文字幕| 国产一区二区欧美日韩| 欧美激情一区二区久久久| 国产精品三级在线| 国产视频亚洲视频| 日韩hd视频在线观看| 久久精品男人天堂| 亚洲国产精品人久久电影| 久久人91精品久久久久久不卡| 亚洲网站在线播放| 亚洲欧美激情另类校园| 在线观看精品国产视频| 亚洲第一男人av| 亚洲一区av在线播放| 岛国av午夜精品| 成人h片在线播放免费网站| 国产一区二区三区欧美| 日韩精品在线观看视频| 中文字幕亚洲二区| 伊人激情综合网| 亚洲图片欧洲图片av| 国产精品偷伦免费视频观看的| 色噜噜狠狠狠综合曰曰曰88av| 亚洲开心激情网| 亚洲精品黄网在线观看| 亚洲娇小xxxx欧美娇小| 久久成人av网站| 一本色道久久综合狠狠躁篇怎么玩| 久久艳片www.17c.com| 人体精品一二三区| 久久精彩免费视频| 日韩a**中文字幕| 亚洲精品国产免费| 国产精品18久久久久久首页狼| 欧美国产极速在线| 欧美大荫蒂xxx| 在线观看久久av| 久久精品国产综合| 欧美性生活大片免费观看网址| 在线成人激情视频| 这里只有精品在线观看| 欧美性高潮床叫视频| 国产精品久久久| 亚洲精品国产成人| 96精品久久久久中文字幕| 国产精品免费一区二区三区都可以| 久久久久久久久久久成人| 日韩精品免费视频| 亚洲精品国产精品乱码不99按摩| 黑人狂躁日本妞一区二区三区| 日韩中文字幕不卡视频| 国产精品羞羞答答| 91黑丝在线观看| 国产成人在线一区二区| 亚洲第一中文字幕| 丝袜美腿亚洲一区二区| 日韩一区av在线| 在线观看国产精品淫| 欧美丰满少妇xxxx| 国产精品麻豆va在线播放| 国产精品大陆在线观看| 日韩精品免费在线视频观看| 在线视频欧美日韩精品| 亚洲国产97在线精品一区| 亚洲欧美国产精品va在线观看| 亚洲男人天堂2023| 国产专区欧美专区| 久久影院资源站| 国产成人久久精品| 日韩欧中文字幕| 国产成人精品网站| 国产亚洲精品一区二区| 欧美电影在线观看网站| 91人人爽人人爽人人精88v|