国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 蘋果教程教程 > 詳細頁面

詳細說明iOS11、iPhone X、Xcode9 適配向導_IOS

詳細說明iOS11、iPhone X、Xcode9 適配向導_IOS

更新時間:2024-04-11 文章作者:未知 信息來源:網絡 閱讀次數:

更新iOS11后,發現有些地方需要做適配,整理后按照優先級分為以下三類:單純升級iOS11后造成的變化;Xcode9 打包后造成的變化;iPhoneX的適配一、單純升級iOS11后造成的變化升級后,...

更新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>”即可

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站
2. 導航欄的新特性

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

右邊為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 來設置大標題的文本樣式

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

iOS11導航欄按鈕層級關系圖

三、iPhone X的適配

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

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

先后做了以下適配

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站
出錯代碼

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

iPhone X

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

其他手機

使用 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 = B
key = _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 = B
key = _suppressGlow         type = B
key = _translucentBackgroundAlpha  type = d
key = _showOnlyCenterItems     type = B
key = _foregroundViewShouldIgnoreStatusBarDataDuringAnimation type = B
key = _tintColor          type = @"UIColor"
key = _lastUsedBackgroundColor   type = @"UIColor"
key = _nextTintTransition      type = @"UIStatusBarStyleAnimationParameters"
key = _overrideHeight        type = @"NSNumber"
key = _disableRasterizationReasons type = @"NSMutableSet"
key = _timeHidden          type = B
key = _statusBarWindow       type = @"UIStatusBarWindow"

// iPhone X
key = _statusBar ; type = @"_UIStatusBar"

// 因此可見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的高度

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

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

首先看下屏幕尺寸

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

這張圖反映出不少信息:

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

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

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

上面這張圖內含信息略多

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

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

詳解iOS11、iPhone X、Xcode9 適配指南_IOS_本站

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

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

您可能感興趣的文章:
  • ios xcode警告與錯誤的分析總結
  • Xcode使用教程詳細講解(全)
  • XCode編譯速度慢的處理方法
  • iOS10 適配-Xcode8問題總結及解決方案
  • Xcode中iOS應用開發的一般項目目錄結構和流程簡介
  • 教你如何解決XCODE升級后插件不能用問題
  • iOS Xcode8更新后輸出log日志關閉的方法
  • xcode8 關閉控制臺不打印不信息的解決方法(圖文詳解)
  • Xcode 8打印log日志的問題小結及解決方法
  • 解決Xcode8打包上傳構建版本無效的辦法
  • 如何去掉Xcode工程中某種類型的警告


溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        欧美tickling网站挠脚心| 国产成+人+日韩+欧美+亚洲 | 99视频超级精品| 久久蜜臀精品av| a美女胸又www黄视频久久| 国产精品色呦呦| 99精品桃花视频在线观看| 亚洲欧美日韩一区二区三区在线观看| 97久久人人超碰| 天天色综合天天| 久久一日本道色综合| 成人永久免费视频| 一区二区三区精品视频在线| 欧美日韩亚洲综合一区 | 国产综合色精品一区二区三区| 精品国产污网站| 91色.com| 久久国产精品99久久久久久老狼| 中文字幕精品综合| 欧美日韩黄色影视| 国产99精品视频| 一区二区高清免费观看影视大全| 这里只有精品电影| 成人激情免费视频| 亚洲高清一区二区三区| 久久综合色天天久久综合图片| 91一区二区三区在线观看| 人人狠狠综合久久亚洲| 中文字幕乱码久久午夜不卡| 欧美人成免费网站| 成人国产亚洲欧美成人综合网| 日韩1区2区日韩1区2区| 国产精品国产三级国产普通话99| 7777精品伊人久久久大香线蕉的 | 美女一区二区在线观看| 国产精品入口麻豆九色| 666欧美在线视频| 在线视频国产一区| 高清av一区二区| 麻豆91精品91久久久的内涵| 一区二区三区中文在线观看| 精品成人在线观看| 欧美一区二区黄色| 欧美日韩成人综合在线一区二区| va亚洲va日韩不卡在线观看| 国产一区二区三区四| 麻豆中文一区二区| 亚洲成人激情自拍| 亚洲黄色小说网站| 亚洲桃色在线一区| 亚洲日本中文字幕区| 日本一区二区综合亚洲| 欧美精品一区二区三区很污很色的| 欧美日韩美少妇| 欧美久久久久免费| 欧美日韩国产在线观看| 91久久一区二区| 色哟哟欧美精品| 一本色道久久综合狠狠躁的推荐| 成人av影视在线观看| 成人做爰69片免费看网站| 国产精品白丝jk白祙喷水网站| 欧美午夜一区二区| 99久久er热在这里只有精品15| 成人永久aaa| 99视频精品全部免费在线| 成人久久视频在线观看| 成人性生交大片免费看中文| 狠狠色丁香九九婷婷综合五月| 精久久久久久久久久久| 国产麻豆精品在线| 波多野结衣中文字幕一区| 99精品视频在线免费观看| 色婷婷精品大视频在线蜜桃视频| 欧美优质美女网站| 欧美二区三区的天堂| 日韩欧美美女一区二区三区| 精品国产制服丝袜高跟| 久久久不卡影院| 综合婷婷亚洲小说| 一区二区免费视频| 喷水一区二区三区| 成人性生交大片免费看中文| 99久久99久久精品免费观看| 色国产综合视频| 日韩天堂在线观看| 国产欧美精品一区aⅴ影院| 亚洲欧美日韩中文字幕一区二区三区 | 国产精品精品国产色婷婷| 亚洲蜜桃精久久久久久久| 亚洲成a人片在线不卡一二三区| 免费看黄色91| 99久久精品免费看国产免费软件| 欧美日韩在线播放一区| 精品剧情v国产在线观看在线| 欧美经典三级视频一区二区三区| 亚洲最色的网站| 国产一区激情在线| 欧美三级电影在线观看| 久久久久久久综合色一本| 亚洲精品成人在线| 久久成人麻豆午夜电影| 日本高清视频一区二区| 久久综合色8888| 亚洲成人自拍偷拍| 波多野结衣欧美| 久久在线观看免费| 日本最新不卡在线| 欧美影片第一页| 中文字幕在线观看不卡视频| 蜜臀av性久久久久蜜臀aⅴ| 色综合av在线| 中文字幕人成不卡一区| 另类小说图片综合网| 色噜噜狠狠一区二区三区果冻| 久久久精品影视| 日本成人在线看| 欧美视频一区在线| 亚洲乱码日产精品bd| 国产成人综合网站| 日韩欧美成人激情| 日韩国产成人精品| 欧美福利视频一区| 99这里只有精品| 国产欧美综合色| 国产v综合v亚洲欧| 欧美激情综合在线| 成人一区二区视频| 久久综合中文字幕| 国产一区二区在线视频| 日韩丝袜美女视频| 麻豆成人av在线| 欧美va亚洲va| 福利电影一区二区三区| 国产丝袜美腿一区二区三区| 韩国av一区二区三区在线观看| 这里是久久伊人| 美女久久久精品| 精品成人一区二区| 国产成人丝袜美腿| 欧美激情艳妇裸体舞| 99久久99久久久精品齐齐| 国产精品久久久久久久久免费相片 | 全国精品久久少妇| 日韩一区二区三| 国产一区二区三区在线观看免费| 欧美r级在线观看| 国产一区二区三区黄视频 | 一区二区免费视频| 欧美日韩一区二区欧美激情| 午夜精彩视频在线观看不卡| 91精品婷婷国产综合久久| 美女视频一区在线观看| 国产日韩欧美综合一区| 成人国产精品免费观看动漫| 亚洲精品免费电影| 69堂成人精品免费视频| 国产美女视频91| 亚洲欧美另类久久久精品2019| 在线日韩一区二区| 久久精工是国产品牌吗| 中日韩免费视频中文字幕| 91视频免费播放| 蜜桃精品视频在线观看| 欧美国产精品久久| 7878成人国产在线观看| 国产福利不卡视频| 亚洲电影欧美电影有声小说| 久久青草国产手机看片福利盒子| 成人毛片视频在线观看| 无码av免费一区二区三区试看| 久久精品欧美一区二区三区麻豆| 日本大香伊一区二区三区| 久久国产精品色婷婷| 亚洲欧美激情一区二区| 日韩欧美亚洲另类制服综合在线| 99国产精品久久| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲女性喷水在线观看一区| 精品少妇一区二区三区在线播放 | 五月天国产精品| 国产亚洲精品aa| 欧美日韩免费一区二区三区| 高潮精品一区videoshd| 蜜桃视频一区二区| 亚洲最新视频在线播放| 国产人久久人人人人爽| 777久久久精品| 久久先锋影音av鲁色资源| 在线视频国产一区| 不卡av电影在线播放| 国产一区二区久久| 日本午夜精品视频在线观看| 亚洲色欲色欲www在线观看| 欧美精品一区二区三区在线播放| 欧美三级日韩三级| 在线国产亚洲欧美| www.亚洲精品| 国产黄色精品网站| 老司机午夜精品99久久|