開發(fā)遇到親身體驗(yàn)纳寂,總結(jié)此文共享與廣大開發(fā)者淘讥,希望你更快解決bug圃伶。
ios11變化做大的要輸導(dǎo)航欄
一. UITableView的改動(dòng)
1.組間距和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;
2.separatorInset 擴(kuò)展
iOS 7 引入separatorInset屬性欺劳,用以設(shè)置 cell 的分割線邊距,在 iOS 11 中對(duì)其進(jìn)行了擴(kuò)展铅鲤』幔可以通過新增的UITableViewSeparatorInsetReference枚舉類型的separatorInsetReference屬性來設(shè)置separatorInset屬性的參照值。
typedef NS_ENUM(NSInteger, UITableViewSeparatorInsetReference) {
UITableViewSeparatorInsetFromCellEdges, //默認(rèn)值邢享,表示separatorInset是從cell的邊緣的偏移量
UITableViewSeparatorInsetFromAutomaticInsets //表示separatorInset屬性值是從一個(gè)insets的偏移量
}
3.Table Views 和 Safe Area
需要注意點(diǎn):
(1)separatorInset 被自動(dòng)地關(guān)聯(lián)到 safe area insets鹏往,因此,默認(rèn)情況下骇塘,表視圖的整個(gè)內(nèi)容避免了其根視圖控制器的安全區(qū)域的插入伊履。
(2)UITableviewCell 和 UITableViewHeaderFooterView的 content view 在安全區(qū)域內(nèi);因此你應(yīng)該始終在 content view 中使用add-subviews操作款违。
(3)所有的 headers 和 footers 都應(yīng)該使用UITableViewHeaderFooterView唐瀑,包括 table headers 和 footers、section headers 和 footers插爹。
二.UINavigationBar和UIToolBar的大改動(dòng)
1.導(dǎo)航欄上添加按鈕:
iOS11以前是直接把按鈕加到了UINavigationBar上面哄辣,而iOS11則是先將按鈕加到了_UITAMICAdaptorView,再加到_UIButtonBarStackView递惋、_UINavigationBarContentView柔滔,接著才是UINavigationBar溢陪。因此如果需要獲取導(dǎo)航欄按鈕 frame 或者 superView萍虽,這里需要專門做下適配
2.導(dǎo)航欄標(biāo)題的自適應(yīng)
(1)UINavigationBar 新增屬性 BOOL值 prefersLargeTitles ,該屬性設(shè)置為true就會(huì)顯示大標(biāo)題形真,
(2)可以通過 largeTitleTextAttributes 來設(shè)置大標(biāo)題的文本樣式杉编,
(3)如果想要在控制不同頁面大標(biāo)題的顯示超全,可以通過設(shè)置當(dāng)前頁面的navigationItem的largeTitleDisplayMode屬性;
navigationItem.largeTitleDisplayMode
typedef NS_ENUM(NSInteger, UINavigationItemLargeTitleDisplayMode) {
/// 自動(dòng)模式依賴上一個(gè) item 的特性
UINavigationItemLargeTitleDisplayModeAutomatic,
/// 針對(duì)當(dāng)前 item 總是啟用大標(biāo)題特性
UINavigationItemLargeTitleDisplayModeAlways,
/// Never
UINavigationItemLargeTitleDisplayModeNever,
}
3.隱藏導(dǎo)航條和狀態(tài)欄
狀態(tài)欄的高度是20邓馒,導(dǎo)航欄的高度是44嘶朱,如果同時(shí)存在狀態(tài)欄的導(dǎo)航條,我們通常會(huì)設(shè)置view上的控件的位置的X 大于等于 64.
一:隱藏導(dǎo)航條:self.navigationController.navigationBarHidden = YES;
二:隱藏狀態(tài)欄:
第一步:在info.plist 文件里增加兩個(gè)類型(Type)為bool 選項(xiàng)光酣, Status bar is initially hidden 設(shè)為YES疏遏;View controller-based status bar appearance 設(shè)為NO;
第二步:在想要隱藏狀態(tài)欄的頁面的寫代碼: [UIApplication sharedApplication].statusBarHidden = YES;
另外救军,值得一說的是: 隱藏狀態(tài)欄和隱藏 導(dǎo)航條 所用到的原理與性質(zhì)一樣财异, 在一個(gè)頁面A隱藏了,其它與他有關(guān)的頁面B(如Apush到B)的狀態(tài)欄/導(dǎo)航欄也會(huì)被隱藏唱遭,如果不想隱藏某個(gè)頁面的狀態(tài)欄/導(dǎo)航條戳寸,則可以在viewWillAppear:(BOOL)animated 里寫 [UIApplication sharedApplication].statusBarHidden = NO/ self.navigationController.navigationBarHidden = NO;
4.原生導(dǎo)航欄搜索樣式發(fā)生變化
查看 API 后發(fā)現(xiàn)拷泽,iOS11后將 searchController 賦值給了 NavigationItem疫鹊,所以可以把你的UISearchController賦值給navigationItem,就可以實(shí)現(xiàn)將UISearchController集成到Navigation司致。
navigationItem.searchController //iOS 11 新增屬性
navigationItem.hidesSearchBarWhenScrolling //決定滑動(dòng)的時(shí)候是否隱藏搜索框拆吆;iOS 11 新增屬性
- UIToolbar 和 UINavigaBar 做了新的自動(dòng)布局?jǐn)U展支持
自定義的bar button items、自定義的title都可以通過layout來表示尺寸脂矫,constraints需要在view內(nèi)部設(shè)置锈拨,所以如果你有一個(gè)自定義的標(biāo)題視圖,你需要確保任何約束只依賴于標(biāo)題視圖及其任何子視圖羹唠。當(dāng)你使用自動(dòng)布局奕枢,系統(tǒng)假設(shè)你知道你在做什么。
自iOS11更新以來遇見的基本變化總結(jié)分享與大家佩微,也希望大家積極分享自己遇到的問題及改動(dòng)缝彬,讓我們?cè)贑oding的路上共同進(jìn)步同行。