好多App都有上下滑動UIScrollview隱藏或者顯示導航欄,在這里我說說我覺得有用的幾種方法:
類型一: 上滑收起, 下滑顯示
1.iOS8之后系統(tǒng)有一個屬性hidesBarsOnSwipe
Objective-C代碼如下
self.navigationController.hidesBarsOnSwipe = YES;
swift代碼如下
self.navigationController?.hidesBarsOnSwipe = true;
2.使用UIScrollViewDelegate一個代理方法
Objective-C代碼如下
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { //scrollView已經(jīng)有拖拽手勢,直接拿到scrollView的拖拽手勢 UIPanGestureRecognizer *pan = scrollView.panGestureRecognizer; //獲取到拖拽的速度 >0 向下拖動 <0 向上拖動 CGFloat velocity = [pan velocityInView:scrollView].y; if (velocity <- 5) { //向上拖動盏阶,隱藏導航欄 [self.navigationController setNavigationBarHidden:YES animated:YES]; }else if (velocity > 5) { //向下拖動浸赫,顯示導航欄 [self.navigationController setNavigationBarHidden:NO animated:YES]; }else if(velocity == 0){ //停止拖拽 } }
swift代碼如下
func scrollViewDidScroll(scrollView: UIScrollView) { let pan = scrollView.panGestureRecognizer let velocity = pan.velocityInView(scrollView).y if velocity < -5 { self.navigationController?.setNavigationBarHidden(true, animated: true) } else if velocity > 5 { self.navigationController?.setNavigationBarHidden(false, animated: true) } }
3.使用UIScrollViewDelegate另一個代理方法
Objective-C代碼如下
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { if (velocity.y > 0.0) { [self.navigationController setNavigationBarHidden:YES animated:YES]; } else if (velocity.y < 0.0){ [self.navigationController setNavigationBarHidden:NO animated:YES]; } }
swift代碼如下
func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { if velocity.y > 0 { self.navigationController?.setNavigationBarHidden(true, animated: true) } else if velocity.y < 0 { self.navigationController?.setNavigationBarHidden(false, animated: true) } }
總結:三種方法都可以,我個人覺得第二種方法效果最好,大家可以學習借鑒一下
類型二: 上滑不透明, 下滑透明
//nvc為透明樣式下
UINavigationController*nvc = [[UINavigationController alloc] initWithRootViewController: ** ]; nvc.navigationBar.barStyle = UIBarStyleDefault;
1.首先,我們把導航欄設置為透明
( ! ! ! 注: iOS11 已更新tablebar視圖層級 新添加UINavigationBarContentView, 這個視圖不能設置alpha, 后續(xù)改進)
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [UIImage new];
1.1 我們設置的是BackgroundImage掠械,說明也許在我們的navigationBar上有一個ImageView的子視圖谅畅,而我們的看到的導航欄實際上看到的就是這個圖片到逊,因此設置它為無圖片我們就可以看到透明,而設置backgroundColor卻不行用狱。
1.2 我們還設置了shadowImage為無圖,它其實就是導航欄下面的那根細線译仗,如果你不寫第二句話你則會看到一根線。
//nvc為一張ImageView 通過設置這個View的透明度達到預期的效果
// 取得這個ImageView
_barImageView = self.navigationController.navigationBar.subviews.firstObject;
2.隨著scrollView的位移改變而改變透明度
在代理里面設置改變的臨界點
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat minAlphaOffset = 0;//- 64; CGFloat maxAlphaOffset = 200; CGFloat offset = scrollView.contentOffset.y; CGFloat alpha = (offset - minAlphaOffset) / (maxAlphaOffset - minAlphaOffset); _barImageView.alpha = alpha; }
類型三: 上滑透明, 下滑不透明
此種效果類似類型一, 只是由hidden變?yōu)閍lpha, 就不舉例了.