日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當(dāng)前位置:雨林木風(fēng)下載站 > 蘋(píng)果教程教程 > 詳細(xì)頁(yè)面

iOS11與iPhoneX適配的一些坑_IOS

iOS11與iPhoneX適配的一些坑_IOS

更新時(shí)間:2024-04-11 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

導(dǎo)本文轉(zhuǎn)載于:http://www.cocoachina.com/ios/20170921/20623.html導(dǎo)航欄導(dǎo)航欄高度的變化iOS11之前導(dǎo)航欄默認(rèn)高度為64pt(這里高度指statusBa...

本文轉(zhuǎn)載于:http://www.cocoachina.com/ios/20170921/20623.html

導(dǎo)航欄

導(dǎo)航欄高度的變化

iOS11之前導(dǎo)航欄默認(rèn)高度為64pt(這里高度指statusBar + NavigationBar),iOS11之后如果設(shè)置了prefersLargeTitles = YES則為96pt,默認(rèn)情況下還是64pt,但在iPhoneX上由于劉海的出現(xiàn)statusBar由以前的20pt變成了44pt,所以iPhoneX上高度變?yōu)?8pt,如果項(xiàng)目里隱藏了導(dǎo)航欄加了自定義按鈕之類的,這里需要注意適配一下。

導(dǎo)航欄圖層及對(duì)titleView布局的影響

iOS11之前導(dǎo)航欄的title是添加在UINavigationItemView上面,而navigationBarButton則直接添加在UINavigationBar上面,如果設(shè)置了titleView,則titleView也是直接添加在UINavigationBar上面。iOS11之后,大概因?yàn)閘argeTitle的原因,視圖層級(jí)發(fā)生了變化,如果沒(méi)有給titleView賦值,則titleView會(huì)直接添加在_UINavigationBarContentView上面,如果賦值了titleView,則會(huì)把titleView添加在_UITAMICAdaptorView上,而navigationBarButton被加在了_UIButtonBarStackView上,然后他們都被加在了_UINavigationBarContentView上,如圖:

iOS11和iPhoneX適配的一些坑_IOS_本站

所以如果你的項(xiàng)目是自定義的navigationBar,那么在iOS11上運(yùn)行就可能出現(xiàn)布局錯(cuò)亂的bug,解決辦法是重寫(xiě)UINavigationBar的layoutSubviews方法,調(diào)整布局,上代碼:

- (void)layoutSubviews {
  [super layoutSubviews];
  //注意導(dǎo)航欄及狀態(tài)欄高度適配
  self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), naviBarHeight);
  for (UIView *view in self.subviews) {
    if([NSStringFromClass([view class]) containsString:@"Background"]) {
      view.frame = self.bounds;
    }
    else if ([NSStringFromClass([view class]) containsString:@"ContentView"]) {
      CGRect frame = view.frame;
      frame.origin.y = statusBarHeight;
      frame.size.height = self.bounds.size.height - frame.origin.y;
      view.frame = frame;
    }
  }
}

再補(bǔ)充一點(diǎn),看了簡(jiǎn)書(shū)App適配iOS11發(fā)現(xiàn)titleView支持autolayout,這要求titleView必須是能夠自撐開(kāi)的或?qū)崿F(xiàn)了- intrinsicContentSize方法

- (CGSize)intrinsicContentSize {
  return UILayoutFittingExpandedSize;
}

UIScrollView、UITableView、UICollectionView

大家在iOS11設(shè)備上運(yùn)行出現(xiàn)最多問(wèn)題應(yīng)該就是tableview莫名奇妙的偏移20pt或者64pt了。。原因是iOS11棄用了automaticallyAdjustsScrollViewInsets屬性,取而代之的是UIScrollView新增了contentInsetAdjustmentBehavior屬性,這一切的罪魁禍?zhǔn)锥际切乱氲膕afeArea,關(guān)于safeArea適配這篇文章iOS 11 安全區(qū)域適配總結(jié)講的很詳細(xì),感興趣的可以看下,我直接貼適配代碼,因?yàn)榈桶姹局苯佑胏ontentInsetAdjustmentBehavior會(huì)報(bào)警告,所有定義了如下的宏(感謝@炒雞范的指正,之前的宏犯了個(gè)低級(jí)錯(cuò)誤...現(xiàn)改為)

#define adjustsScrollViewInsets(scrollView)\
do {\
_Pragma("clang diagnostic push")\
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"")\
if ([scrollView respondsToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
  NSMethodSignature *signature = [UIScrollView instanceMethodSignatureForSelector:@selector(setContentInsetAdjustmentBehavior:)];\
  NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];\
  NSInteger argument = 2;\
  invocation.target = scrollView;\
  invocation.selector = @selector(setContentInsetAdjustmentBehavior:);\
  [invocation setArgument:&argument atIndex:2];\
  [invocation retainArguments];\
  [invocation invoke];\
}\
_Pragma("clang diagnostic pop")\
} while (0)

還有的發(fā)現(xiàn)某些界面tableView的sectionHeader、sectionFooter高度與設(shè)置不符的問(wèn)題,在iOS11中如果不實(shí)現(xiàn) -tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection: ,則-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不會(huì)被調(diào)用,導(dǎo)致它們都變成了默認(rèn)高度,這是因?yàn)閠ableView在iOS11默認(rèn)使用Self-Sizing,tableView的estimatedRowHeight、estimatedSectionHeaderHeight、 estimatedSectionFooterHeight三個(gè)高度估算屬性由默認(rèn)的0變成了UITableViewAutomaticDimension,解決辦法簡(jiǎn)單粗暴,就是實(shí)現(xiàn)對(duì)應(yīng)方法或把這三個(gè)屬性設(shè)為0。

如果你使用了Masonry,那么你需要適配safeArea

if (@available(iOS 11.0, *)) {
  make.edges.equalTo()(self.view.safeAreaInsets)
} else {
  make.edges.equalTo()(self.view)
}

iPhoneX

LaunchImage

關(guān)于iPhoneX(我就不吐槽劉海了...),如果你的APP在iPhoneX上運(yùn)行發(fā)現(xiàn)沒(méi)有充滿屏幕,上下有黑色區(qū)域,那么你應(yīng)該也像我一樣LaunchImage沒(méi)有用storyboard而是用的Assets,解決辦法如圖,啟動(dòng)圖的尺寸為1125x2436,or you can iOS開(kāi)發(fā)時(shí)如何使用 Launch Screen Storyboard。

iOS11和iPhoneX適配的一些坑_IOS_本站

TabBarController

因?yàn)槲覀兊捻?xiàng)目用了第三方的TabBarController,在iPhoneX運(yùn)行,tabBar看起來(lái)怪怪的...估計(jì)作者要等到猴年馬月才適配iPhoneX,項(xiàng)目又著急上線,就自己修改了第三方,主要是tabBar高度及tabBarItem偏移適配,iPhoneX由于底部安全區(qū)的原因UITabBar高度由49pt變成了83pt,可以通過(guò)判斷機(jī)型來(lái)修改相關(guān)界面代碼

#define kDevice_Is_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)

目前遇到的就這些坑,歡迎大家指正補(bǔ)充~

作為一名iOS開(kāi)發(fā)人員,想到當(dāng)年嘲笑Android開(kāi)發(fā)蛋疼的適配各種機(jī)型心情如圖...

iOS11和iPhoneX適配的一些坑_IOS_本站

總結(jié)

以上所述是小編給大家介紹的iOS11和iPhoneX適配的一些坑,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)本站網(wǎng)站的支持!

您可能感興趣的文章:
  • iOS10 適配-Xcode8問(wèn)題總結(jié)及解決方案
  • iOS10 適配遠(yuǎn)程推送功能實(shí)現(xiàn)代碼
  • IOS自適配利器Masonry使用指南
  • 詳解iOS11、iPhone X、Xcode9 適配指南
  • 解析iOS10中的極光推送消息的適配
  • Xcode8以及iOS10適配等常見(jiàn)問(wèn)題匯總(整理篇)
  • iOS開(kāi)發(fā) 全機(jī)型適配解決方法
  • iOS 11 下適配UITableView 問(wèn)題
  • iOS適配iPhone XS、 iPhone XS Max and iPhone XR的方法淺析


溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 亚洲偷自拍另类图片二区 | 久久综合九色综合97伊人麻豆 | 在线观看老湿机视频福利 | 国内精品欧美久久精品 | 91在线手机精品免费观看 | 亚洲一区二区三区麻豆 | 国产1024精品视频专区免费 | 麻豆果冻精品一区二区 | 综合久久久久 | 91在线公开视频 | 日韩精品欧美精品中文精品 | 日本xxxx色视频在线观看免 | 欧美影视一区 | 日韩www视频 | 99热这里只有精品国产99 | 免费人与人做爰在线观看 | 色综合久久综合欧美综合网 | 亚洲综合日韩在线亚洲欧美专区 | 在线观看免费a∨网站 | 国产91精品一区二区麻豆网站 | 韩国免费毛片在线看 | 午夜逼逼 | 亚洲精品三区 | 日韩国产在线 | 欧美成人精品动漫在线专区 | 亚洲天堂久久 | 99久久国产免费中文无字幕 | 国产成人高清精品免费5388密 | 国产精品一区亚洲一区天堂 | 免费看全黄特黄毛片 | 日韩手机在线视频 | 免费在线观看亚洲 | 欧美性猛交xxx嘿人猛交 | 午夜国产精品久久影院 | 亚洲在线欧美 | 天天视频一区二区三区 | 久久综合久久综合久久综合 | 亚洲在线国产 | 精品蜜桃 | 99精品视频在线播放2 | 国产精品综合久成人 |