適配iOS11和iPhone X總結(jié)

前幾天剛剛用Xcode8打包發(fā)布了1.4.0版本搪柑,然后馬上iOS11就發(fā)布了,當(dāng)時(shí)還想著要不要撤回來(lái)索烹,不然沒(méi)有適配在iOS11上豈不是亂了工碾。后來(lái)發(fā)現(xiàn)是多慮了,因?yàn)槭怯肵code8打的包百姓,所以不會(huì)有很大問(wèn)題渊额。伴隨著iOS11發(fā)布,Xcode9也更新了垒拢,用Xcode9打包的話需要適配好旬迹,不然真的會(huì)亂的。
下面就介紹下適配過(guò)程中一些問(wèn)題和解決辦法求类。

適配iOS 11

1 有些頁(yè)面UITableView顯示不全


原因:在這些頁(yè)面我都使用到了UITableView的contentSize奔垦,比如下面這個(gè)

- (void)reloadScrollView
{
    CGFloat top = 0;
    [self.pictureView setZy_Top:top];
    top = top + self.pictureView.zy_height;
    [self.viewChange setZy_Top:top];
    top = top + self.viewChange.zy_height;
    [self.tableViewFitment setZy_Top:top];
    [self.tableViewFitment setZy_Height:self.tableViewFitment.contentSize.height];
    top = top + self.tableViewFitment.contentSize.height + 20;
    [self.viewBottom setZy_Top:top];
    top = top + self.viewBottom.zy_height;
    self.mainScrollView.contentSize = CGSizeMake(kWidthScreen, top);
}

參考文章你可能需要為你的 APP 適配 iOS 11
在iOS11中默認(rèn)開(kāi)啟了Self-Sizing,這個(gè)應(yīng)該是UITableView最大的改變尸疆。在iOS8引入Self-Sizing之后椿猎,我們可以通過(guò)實(shí)現(xiàn)estimatedRowHeight相關(guān)的屬性來(lái)展示動(dòng)態(tài)的內(nèi)容,實(shí)現(xiàn)了estimatedRowHeight屬性后仓技,得到的初始contentSize是個(gè)估算值鸵贬,是通過(guò)estimatedRowHeight 乘以 cell的個(gè)數(shù)得到的,并不是最終的contentSize脖捻,tableView就不會(huì)一次性計(jì)算所有的cell的高度了阔逼,只會(huì)計(jì)算當(dāng)前屏幕能夠顯示的cell個(gè)數(shù)再加上幾個(gè),滑動(dòng)的時(shí)候tableView不停地得到新的cell地沮,更新自己的contentSize嗜浮,在滑到最后的時(shí)候羡亩,會(huì)得到正確的contentSize。

Self-Sizing在iOS11下是默認(rèn)開(kāi)啟的危融,Header畏铆,footers,and Cells都默認(rèn)開(kāi)啟Self-Sizing吉殃,所有estimated高度默認(rèn)值從iOS11之前的0變?yōu)閁ITableViewAutomaticDimension辞居。如果項(xiàng)目中沒(méi)有使用estimatedRowHeight屬性,在iOS11的環(huán)境下就要注意了蛋勺,因?yàn)殚_(kāi)啟Self-Sizing之后瓦灶,tableView是使用estimatedRowHeight屬性的,這樣就會(huì)造成contentSize和contentOffset值的變化抱完,如果是有動(dòng)畫(huà)觀察這兩個(gè)屬性的變化進(jìn)行的贼陶,就會(huì)造成動(dòng)畫(huà)的異常,因?yàn)樵诠浪阈懈邫C(jī)制下巧娱,contentSize的值是一點(diǎn)點(diǎn)地變化更新的碉怔,所有cell顯示完后才是最終的contentSize值。因?yàn)椴粫?huì)緩存正確的行高禁添,tableView reloadData的時(shí)候撮胧,會(huì)重新計(jì)算contentSize,就有可能引起contentOffset的變化上荡。
iOS11下不想使用Self-Sizing的話趴樱,可以通過(guò)以下方式關(guān)閉:

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

2 UINavigationBar 上面 titleView 為 UISearchBar的時(shí)候,界面顯示異常


如圖酪捡,searchBar高度會(huì)向下變高,參考文章參考文章1 參考文章2
解決辦法纳账,將UISearchBar放到一個(gè)View上逛薇,然后將此view作為titleView,參考代碼如下

        let wrapView = UIView(frame: CGRect(x: 60, y: 0, width: SCREENWIDTH - 80, height: 44))
        wrapView.addSubview(self.searchBar)
        self.navigationItem.titleView = wrapView

但是還是顯示有點(diǎn)問(wèn)題,searchBar背景有點(diǎn)灰顏色疏虫。設(shè)置一下背景圖片就可以了永罚。


        let searchBarBg = UIImage.createImage(with: UIColor.clear)
        self.searchBar.backgroundImage = searchBarBg

3 消息通知界面tableView往上移動(dòng)了,


參考文章
iOS11中automaticallyAdjustsScrollViewInsets屬性失效了卧秘,增加了contentInsetAdjustmentBehavior屬性呢袱,automaticallyAdjustsScrollViewInsets是viewController的屬性,默認(rèn)為true翅敌,一般來(lái)說(shuō)如果scrollView直接添加到控制器視圖上時(shí)羞福,會(huì)自動(dòng)設(shè)置scroll的inset屬性來(lái)空出status bar, search bar, navigationBar, toolBar等的位置來(lái),在日常的開(kāi)發(fā)中為了程序的穩(wěn)定性與自由度一般我們是將這個(gè)屬性設(shè)置為false蚯涮。但是治专,這個(gè)屬性現(xiàn)在失效了卖陵,所以會(huì)導(dǎo)致上面的問(wèn)題。
解決辦法很容易张峰,如下

        if #available(iOS 11.0, *) {
            tableView.contentInsetAdjustmentBehavior = .never
            tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0)
            tableView.scrollIndicatorInsets = tableView.contentInset
        }

4 UINavigationBar顯示出問(wèn)題

參考文章
相較于iOS11之前的版本泪蔫,UINavigationBar結(jié)構(gòu)上也與之前不同,如下圖所示

iOS11

iOS11之前

可以看出喘批,原來(lái)的UINavigationItemView 被替換為 UINavigationBarContentView了撩荣。一般的方法是寫(xiě)個(gè)子類(lèi)繼承UINavigationBar,然后遍歷UINavigationBar的子控件并修改frame饶深。參考文章中有說(shuō)餐曹,但是我試了下,發(fā)現(xiàn)還是有問(wèn)題粥喜,別的界面可能會(huì)受到影響凸主。所以我的辦法是直接修改背景為白色,然后將下面那根線給刪掉额湘,自己加一個(gè)線卿吐。
參考代碼如下:

    fileprivate lazy var navBar: UINavigationBar = {
        let navBar = UINavigationBar()
        navBar.setBackgroundImage(UIImage(), for: .default)
        navBar.shadowImage = UIImage()
        navBar.backgroundColor = UIColor.white
        return navBar
    }()

5 UIScrollView頭部向下移動(dòng)了


這是也是因?yàn)閍utomaticallyAdjustsScrollViewInsets失效,增加了contentInsetAdjustmentBehavior的原因锋华,跟上面一樣嗡官。
解決辦法,是使用runtime毯焕,將UIScrollView的contentInsetAdjustmentBehavior屬性默認(rèn)置為never衍腥,代碼如下:

@implementation UIScrollView (contentInset)
+ (void)load {
    [super load];
    //因?yàn)槭菫榱诉m配iOS11 所以只有在系統(tǒng)是iOS11的時(shí)候用過(guò)運(yùn)行時(shí)修改這個(gè)值
    if (@available(iOS 11.0, *)) {
        Method originalM = class_getInstanceMethod([self class], @selector(initWithFrame:));
        Method exchangeM = class_getInstanceMethod([self class], @selector(cl_initWithFrame:));
        method_exchangeImplementations(originalM, exchangeM);
    }
}
- (instancetype)cl_initWithFrame:(CGRect)frame {

    if (@available(iOS 11.0, *)) {
        self.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
        // Fallback on earlier versions
    }
    return [self cl_initWithFrame:frame];
}
@end

適配iPhone X

其實(shí)很簡(jiǎn)單,就是就是狀態(tài)欄由20改為了44纳猫,底部的tab高度由49改為了82婆咸,給你幾個(gè)宏就行。
判斷是否為iPhone X方法

+ (BOOL)isiPhoneX
{
    UIApplication *app = [UIApplication sharedApplication];
    UIView *statusBar = [app valueForKey:@"statusBar"];
    if ([statusBar isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
        return YES;
    } else {
        return NO;
    }
}

以后就不要將高度寫(xiě)死了芜辕,用下面這些就好了尚骄。

#define kNavBarHeight 44.0
#define kStatusBarHeight ([UIDevice isiPhoneX] ? 44.0:20.0)
#define kStatueAddHeight (kStatusBarHeight - 20.0)
#define kTopHeight (kStatusBarHeight + kNavBarHeight)
#define kTabBarHeight ([UIDevice isiPhoneX] ? 83.0:49.0)
#define kTabBarAddHeight (kTabBarHeight - 49.0)

屏幕下方那個(gè)home指示器可以隱藏掉的,方法如下:

 if (@available(iOS 11.0, *)) {
       [self setNeedsUpdateOfHomeIndicatorAutoHidden];
 }

- (BOOL)prefersHomeIndicatorAutoHidden
{
    return YES;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侵续,一起剝皮案震驚了整個(gè)濱河市倔丈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌状蜗,老刑警劉巖需五,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異轧坎,居然都是意外死亡宏邮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜀铲,“玉大人边琉,你說(shuō)我怎么就攤上這事〖侨埃” “怎么了变姨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)厌丑。 經(jīng)常有香客問(wèn)我定欧,道長(zhǎng),這世上最難降的妖魔是什么怒竿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任砍鸠,我火速辦了婚禮,結(jié)果婚禮上耕驰,老公的妹妹穿的比我還像新娘爷辱。我一直安慰自己,他們只是感情好朦肘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布饭弓。 她就那樣靜靜地躺著,像睡著了一般媒抠。 火紅的嫁衣襯著肌膚如雪弟断。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天趴生,我揣著相機(jī)與錄音阀趴,去河邊找鬼。 笑死苍匆,一個(gè)胖子當(dāng)著我的面吹牛刘急,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浸踩,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼排霉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了民轴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤球订,失蹤者是張志新(化名)和其女友劉穎后裸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體冒滩,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡微驶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因苹。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苟耻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扶檐,到底是詐尸還是另有隱情凶杖,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布款筑,位于F島的核電站智蝠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奈梳。R本人自食惡果不足惜杈湾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攘须。 院中可真熱鬧漆撞,春花似錦、人聲如沸于宙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)限煞。三九已至抹恳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間署驻,已是汗流浹背奋献。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旺上,地道東北人瓶蚂。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宣吱,于是被迫代替她去往敵國(guó)和親窃这。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 蘋(píng)果WWDC開(kāi)發(fā)者大會(huì)上征候,終于發(fā)布了大家期待已久的iOS 11杭攻,有些新特性功能確實(shí)出人意料。不過(guò)大的方面蘋(píng)果...
    Mr_Say_Yes閱讀 3,318評(píng)論 6 15
  • 作者:zombieEngineer鏈接:http://www.reibang.com/p/ef423efd5650...
    KingLionsFrank閱讀 743評(píng)論 2 1
  • iOS 11 為整個(gè)生態(tài)系統(tǒng)的 UI 元素帶來(lái)了一種更加大膽疤坝、動(dòng)態(tài)的新風(fēng)格兆解。 本文介紹iOS11中在UI方面做了哪...
    阿凡提說(shuō)AI閱讀 590評(píng)論 0 1
  • 聲明:這篇文章轉(zhuǎn)載 *zombieEngineer * [Cocoa開(kāi)發(fā)者社區(qū)]僅供大家參考學(xué)習(xí)使用,也方便自己...
    追逐_chase閱讀 577評(píng)論 0 0
  • 本文為作者原創(chuàng)跑揉,未經(jīng)作者允許不得轉(zhuǎn)載锅睛。該文同時(shí)發(fā)表在騰訊bugly公眾號(hào):https://mp.weixin.qq...
    sonialiu閱讀 101,621評(píng)論 74 283