在寫透明導航欄的時候,如果沒有側滑手勢pop控制器倒是一件簡單的事。如我之前的項目一樣,直接設置就行了,也不應考慮過渡動畫。但是后來在自己練習代碼的時候發(fā)現(xiàn),這側滑從不透明到透明界面,導航欄的突變實在是讓人感覺很不爽。于是就想解決一下:
設置導航欄全透明可以通過下面代碼設置:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.subviews[0].alpha = 0;
如要實現(xiàn)拖動一個tableView的時候導航欄能夠從透明變?yōu)椴煌该鲃t需要通過監(jiān)聽tableView的滑動來完成一些操作:
監(jiān)聽scrollView滑動
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView == self.tableView) {
CGFloat offsetY = scrollView.contentOffset.y;
[self setNavigationBarColorWithOffsetY:offsetY];
}
}
// 界面滑動時導航欄隨偏移量 實時變化
- (void)setNavigationBarColorWithOffsetY:(CGFloat)offsetY {
UIImageView *backView = self.navigationController.navigationBar.subviews[0];
if (offsetY <= 0) {
backView.alpha = 0;
} else if (offsetY > 0 && offsetY < 64) {
backView.alpha = offsetY / 64;
} else if (offsetY >= 64 ) {//&& offsetY <= NavBar_HEIGHT + 30
backView.alpha = 1;
}
}
主體功能實現(xiàn)代碼很簡單,就是上面部分。還有一個需要注意的點是:UINavigationController下只有一個的UINavigationBar,push\pop時,需要額外設置導航欄
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 設置導航欄為透明,并根據(jù)當前tableView的偏移量設置對應的 alpha
self.navigationController.navigationBar.translucent = YES;
[self setNavigationBarColorWithOffsetY:self.tableView.contentOffset.y];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// 設置導航欄 為不透明
self.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBar.subviews[0].alpha = 1.0;
}
導航欄漸變.gif
但是有一個問題,使用側滑手勢返回時會出現(xiàn)導航欄alpha值突變,導致一下從不透明->透明。
如果要處理這種情況:
方法1:隱藏系統(tǒng)NavigationBar,自己實現(xiàn)一個類似NavigationBar的View(類似網(wǎng)易云側滑返回)。
方法2:在push到下一個界面前對屏幕進行截圖保存,側滑手勢,在側滑的時候拿到保存的圖片添加到UIWindow上。手勢完成后再移除圖片(類似斗魚側滑返回)。