中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS11和iPhoneX適配的示例分析

發布時間:2021-08-04 11:58:55 來源:億速云 閱讀:156 作者:小新 欄目:移動開發

小編給大家分享一下iOS11和iPhoneX適配的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

導航欄

導航欄高度的變化

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

導航欄圖層及對titleView布局的影響

iOS11之前導航欄的title是添加在UINavigationItemView上面,而navigationBarButton則直接添加在UINavigationBar上面,如果設置了titleView,則titleView也是直接添加在UINavigationBar上面。iOS11之后,大概因為largeTitle的原因,視圖層級發生了變化,如果沒有給titleView賦值,則titleView會直接添加在_UINavigationBarContentView上面,如果賦值了titleView,則會把titleView添加在_UITAMICAdaptorView上,而navigationBarButton被加在了_UIButtonBarStackView上,然后他們都被加在了_UINavigationBarContentView上,如圖:

iOS11和iPhoneX適配的示例分析

所以如果你的項目是自定義的navigationBar,那么在iOS11上運行就可能出現布局錯亂的bug,解決辦法是重寫UINavigationBar的layoutSubviews方法,調整布局,上代碼:

- (void)layoutSubviews {
  [super layoutSubviews];
  //注意導航欄及狀態欄高度適配
  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;
    }
  }
}

再補充一點,看了簡書App適配iOS11發現titleView支持autolayout,這要求titleView必須是能夠自撐開的或實現了- intrinsicContentSize方法

- (CGSize)intrinsicContentSize {
  return UILayoutFittingExpandedSize;
}

UIScrollView、UITableView、UICollectionView

大家在iOS11設備上運行出現最多問題應該就是tableview莫名奇妙的偏移20pt或者64pt了。。原因是iOS11棄用了automaticallyAdjustsScrollViewInsets屬性,取而代之的是UIScrollView新增了contentInsetAdjustmentBehavior屬性,這一切的罪魁禍首都是新引入的safeArea,關于safeArea適配這篇文章iOS 11 安全區域適配總結講的很詳細,感興趣的可以看下,我直接貼適配代碼,因為低版本直接用contentInsetAdjustmentBehavior會報警告,所有定義了如下的宏(感謝@炒雞范的指正,之前的宏犯了個低級錯誤...現改為)

#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)

還有的發現某些界面tableView的sectionHeader、sectionFooter高度與設置不符的問題,在iOS11中如果不實現 -tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection: ,則-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不會被調用,導致它們都變成了默認高度,這是因為tableView在iOS11默認使用Self-Sizing,tableView的estimatedRowHeight、estimatedSectionHeaderHeight、 estimatedSectionFooterHeight三個高度估算屬性由默認的0變成了UITableViewAutomaticDimension,解決辦法簡單粗暴,就是實現對應方法或把這三個屬性設為0。

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

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

iPhoneX

LaunchImage

關于iPhoneX(我就不吐槽劉海了...),如果你的APP在iPhoneX上運行發現沒有充滿屏幕,上下有黑色區域,那么你應該也像我一樣LaunchImage沒有用storyboard而是用的Assets,解決辦法如圖,啟動圖的尺寸為1125x2436,or you can iOS開發時如何使用 Launch Screen Storyboard。

iOS11和iPhoneX適配的示例分析

TabBarController

因為我們的項目用了第三方的TabBarController,在iPhoneX運行,tabBar看起來怪怪的...估計作者要等到猴年馬月才適配iPhoneX,項目又著急上線,就自己修改了第三方,主要是tabBar高度及tabBarItem偏移適配,iPhoneX由于底部安全區的原因UITabBar高度由49pt變成了83pt,可以通過判斷機型來修改相關界面代碼

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

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

作為一名iOS開發人員,想到當年嘲笑Android開發蛋疼的適配各種機型心情如圖...

iOS11和iPhoneX適配的示例分析

以上是“iOS11和iPhoneX適配的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

商都县| 昌图县| 白朗县| 正镶白旗| 安丘市| 焉耆| 平山县| 景洪市| 宁安市| 昭觉县| 金平| 彰武县| 汨罗市| 高陵县| 乌拉特前旗| 屯昌县| 高尔夫| 中宁县| 湟中县| 资阳市| 石屏县| 周口市| 洱源县| 上高县| 乌海市| 邯郸县| 梓潼县| 大田县| 延川县| 界首市| 阿巴嘎旗| 灵寿县| 浠水县| 西城区| 开封市| 穆棱市| 大英县| 报价| 永嘉县| 冕宁县| 昌宁县|