最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年09月25日 10:31:53   作者:si1ence  
這篇文章主要介紹了詳解iOS11、iPhone X、Xcode9 適配指南,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

更新iOS11后,發(fā)現(xiàn)有些地方需要做適配,整理后按照優(yōu)先級分為以下三類:

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

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

升級后,發(fā)現(xiàn)某個(gè)擁有tableView的界面錯(cuò)亂,組間距和contentInset錯(cuò)亂,因?yàn)閕OS11中 UIViewController 的 automaticallyAdjustsScrollViewInsets 屬性被廢棄了,因此當(dāng)tableView超出安全區(qū)域時(shí),系統(tǒng)自動(dòng)會(huì)調(diào)整SafeAreaInsets值,進(jìn)而影響adjustedContentInset值

// 有些界面以下使用代理方法來設(shè)置,發(fā)現(xiàn)并沒有生效
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;

// 這樣的原理是因?yàn)橹爸皇菍?shí)現(xiàn)了高度的代理方法,卻沒有實(shí)現(xiàn)View的代理方法,iOS10及以前這么寫是沒問題的,iOS11開啟了行高估算機(jī)制引起的bug,因此有以下幾種解決方法:

// 解決方法一:添加實(shí)現(xiàn)View的代理方法
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
  return nil;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
  return nil;
}

// 解決方法二:直接使用tableView屬性進(jìn)行設(shè)置,修復(fù)該UI錯(cuò)亂
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 5;

[_optionTableView setContentInset:UIEdgeInsetsMake(-35, 0, 0, 0)];

// 解決方法三:添加以下代碼關(guān)閉估算行高
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

四、使用Xcode9 編譯后發(fā)現(xiàn)的問題

1. 發(fā)現(xiàn)“fastSocket”第三方報(bào)錯(cuò),具體原因是缺少C99的頭文件,引入“#include <sys/time.h>”即可


2. 導(dǎo)航欄的新特性

原生的搜索欄樣式發(fā)生改變


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

查看 API 后發(fā)現(xiàn),iOS11后將 searchController 賦值給了 NavigationItem,通過屬性 hidesSearchBarWhenScrolling 可以控制搜索欄是否在滑動(dòng)的時(shí)候進(jìn)行隱藏和顯示

// 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 來實(shí)現(xiàn)下面的效果,并可以通過 largeTitleTextAttributes 來設(shè)置大標(biāo)題的文本樣式

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


iOS10及以下版本導(dǎo)航欄按鈕層級關(guān)系圖


iOS11導(dǎo)航欄按鈕層級關(guān)系圖

三、iPhone X的適配

下載完Xcode9之后,第一件事自然是在 iPhone X(模擬器)上過把癮,然后編譯后就發(fā)現(xiàn)報(bào)錯(cuò)了

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

先后做了以下適配

適配點(diǎn)一:項(xiàng)目中使用狀態(tài)欄中圖標(biāo)判斷當(dāng)前網(wǎng)絡(luò)的具體狀態(tài)


出錯(cuò)代碼

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


iPhone X


其他手機(jī)

使用 runtime 打印其所有屬性,發(fā)現(xiàn)以下差異

// 測試代碼
#import <objc/runtime.h>
NSMutableString *resultStr = [NSMutableString string];
//獲取指定類的Ivar列表及Ivar個(gè)數(shù)
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);
// 其他版本的手機(jī)
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的狀態(tài)欄是多嵌套了一層,多取一次即可,最終適配代碼為:
NSArray *children;
// 不能用 [[self deviceVersion] isEqualToString:@"iPhone X"] 來判斷,因?yàn)槟M器不會(huì)返回 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];
  }

適配點(diǎn)二:解決這個(gè)問題后項(xiàng)目跑起來發(fā)現(xiàn),整個(gè)app界面上下各空出大概40pt的高度


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


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

首先看下屏幕尺寸


這張圖反映出不少信息:

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

在設(shè)計(jì)方面,蘋果官方文檔human-interface-guidelines有明確要求,下面結(jié)合圖例進(jìn)行說明:


展示出來的設(shè)計(jì)布局要求填滿整個(gè)屏幕

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


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

上面這張圖內(nèi)含信息略多

頭部導(dǎo)航欄不予許進(jìn)行用戶交互的,意味著下面這兩種情況 Apple 官方是不允許的



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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • IOS面試大全之常見算法

    IOS面試大全之常見算法

    之前看了很多面試題,感覺要不是不夠就是過于冗余,于是我將網(wǎng)上的一些面試題進(jìn)行了刪減和分類,這篇文章先給大家分享一下IOS中的常見算法,有需要的可以參考借鑒。
    2016-09-09
  • iOS實(shí)現(xiàn)文本分頁的方法示例

    iOS實(shí)現(xiàn)文本分頁的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)文本分頁的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • iOS圖片拉伸的4種方法

    iOS圖片拉伸的4種方法

    這篇文章主要為大家詳細(xì)介紹了iOS圖片拉伸的4種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • iOS開發(fā)教程之扇形動(dòng)畫的實(shí)現(xiàn)

    iOS開發(fā)教程之扇形動(dòng)畫的實(shí)現(xiàn)

    實(shí)現(xiàn)扇形圖大家應(yīng)該都會(huì)的,但是扇形動(dòng)畫大家都會(huì)實(shí)現(xiàn)嗎?下面這篇文章主要給大家介紹了關(guān)于iOS開發(fā)教程之扇形動(dòng)畫實(shí)現(xiàn)的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • iOS開發(fā)之視圖切換

    iOS開發(fā)之視圖切換

    在iOS開發(fā)中視圖的切換是很頻繁的,獨(dú)立的視圖應(yīng)用在實(shí)際開發(fā)過程中并不常見,除非你的應(yīng)用足夠簡單。在iOS開發(fā)中常用的視圖切換有三種,今天我們將一一介紹,希望大家能夠喜歡。
    2016-04-04
  • 舉例詳解iOS開發(fā)過程中的沙盒機(jī)制與文件

    舉例詳解iOS開發(fā)過程中的沙盒機(jī)制與文件

    這篇文章主要介紹了舉例詳解iOS開發(fā)過程中的沙盒機(jī)制與文件,示例代碼為傳統(tǒng)的Obejective-C,需要的朋友可以參考下
    2015-09-09
  • LRecyclerView側(cè)滑iOS阻塞效果不完整的解決辦法

    LRecyclerView側(cè)滑iOS阻塞效果不完整的解決辦法

    這篇文章主要介紹了LRecyclerView側(cè)滑iOS阻塞效果不完整的解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2016-12-12
  • iOS開發(fā)中Swift逃逸閉包知識(shí)

    iOS開發(fā)中Swift逃逸閉包知識(shí)

    這篇文章主要介紹了iOS開發(fā)中Swift逃逸閉包的相關(guān)知識(shí)點(diǎn)以及需要注意的地方,需要的朋友收藏下吧。
    2018-02-02
  • 詳解iOS14 Widget 開發(fā)相關(guān)及易報(bào)錯(cuò)地方處理

    詳解iOS14 Widget 開發(fā)相關(guān)及易報(bào)錯(cuò)地方處理

    這篇文章主要介紹了詳解iOS14 Widget 開發(fā)相關(guān)及易報(bào)錯(cuò)地方處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • MacOS無法掛載NFS Operation not permitted錯(cuò)誤解決辦法

    MacOS無法掛載NFS Operation not permitted錯(cuò)誤解決辦法

    這篇文章主要介紹了MacOS無法掛載NFS Operation not permitted錯(cuò)誤解決辦法的相關(guān)資料
    2017-02-02

最新評論

玉溪市| 双峰县| 新竹市| 洮南市| 松潘县| 革吉县| 四川省| 肇东市| 广饶县| 邵阳县| 宁德市| 繁昌县| 漳浦县| 浑源县| 五华县| 杨浦区| 山东| 岳普湖县| 汶上县| 新源县| 洛浦县| 永丰县| 德阳市| 原平市| 巴中市| 河津市| 瑞昌市| 柳江县| 米易县| 衡东县| 商丘市| 蓬莱市| 永济市| 贡觉县| 郴州市| 泸水县| 红河县| 延川县| 乐平市| 徐水县| 谢通门县|