這里不說原理,不說iOS 11更新了什么功能,只告訴你遇到這樣的問題怎么改,就是這么簡單粗暴
一、隱藏導航欄
self.navigationController.navigationBar.hidden = YES;
隱藏可以說是非常簡單了,就一句代碼搞定。但是如果隱藏導航欄又遇到了scrollView(scrollVIew當然包括tableVIew?。。?,就會發(fā)現(xiàn)在iOS 11手機里,頁面頂部有一個20像素的空白,不是一般的丑。解決這個問題很簡單,也差不多四舍五入是一句:
if (@available(iOS 11.0, *)){//避免滾動視圖頂部出現(xiàn)20的空白以及push或者pop的時候頁面有一個上移或者下移的異常動畫的問題
[[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
上面這句添加到AppDelegate 里面就完美的解決了。
二、導航欄透明漸變
透明漸變是什么意思呢,就是剛進入頁面的時候?qū)Ш綑谑峭该鞯?,然后隨著scrollView 的滑動,改變導航欄的透明度。
第一種解決方案:
隱藏導航欄,然后自定義一個View 裝作是導航欄的樣子,這種方法大家都會,不多說。
第二種解決方案:
在 viewWillAppear 中通過 setBackgroundImage 方法實現(xiàn):
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithWhite:1 alpha:0]] forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setShadowImage:[UIImage imageWithColor:[UIColor colorWithWhite:1 alpha:0]]];
在 viewWillDisappear 中置為 nil :
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setShadowImage:nil];
在scrollView的代理方法 scrollViewDidScroll: 中改變導航欄的 alpha 值:
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithWhite:1 alpha:alpha]] forBarMetrics:UIBarMetricsDefault];
如果導航欄下面需要那條黑線的話,那么也要改變那條線的 alpha 值:
[self.navigationController.navigationBar setShadowImage:[UIImage imageWithColor:[UIColor colorWithWhite:1 alpha:alpha]]];
解決透明并且漸變的問題了,第一個和第二個問題是可以互通的,主要解決不顯示導航欄的問題。
三、自定義titleView的問題
我們自定義titleView主要是這句話:
self.navigationItem.titleView = customView;
在iOS 11 中,發(fā)現(xiàn)不能改變 titleView 的 frame ,就縮在中間那一坨。這里只給出最終的解決方法:
1.customView 用懶加載來創(chuàng)建;
2.在懶加載里用添加子視圖的方法添加titleView;
[self.navigationController.navigationBar addSubview:customView];
3.在 viewWillAppear 方法中設(shè)置 customView.hidden = NO;
在 viewWillDisappear 方法中設(shè)置 customView.hidden = YES;
以上是我剛剛遇到的 iOS 11 中與導航欄有關(guān)的問題及解決辦法,親測有效,僅供參考,歡迎指正。