关于导航栏渐变,本人在写APP的时候,发现了各路大神各现其通,其实我觉得这个是个很简单的问题,不需要搞得那么麻烦,对个项目要求整齐来说,一般会建一个工具类,自定义View,各个同事需要的时候,直接调用即可,如下代码:
-(void)craetNavBar{ self.Naviews=[[NavBarViewHiddenAphle alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, Height_NavBar)]; self.Naviews.alpha = 0.0; self.Naviews.delegate=self; [self.view addSubview:self.Naviews]; }
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGFloat minAlphaOffset = - Height_NavBar; CGFloat maxAlphaOffset = 200; CGFloat offset = scrollView.contentOffset.y; CGFloat alpha = (offset - minAlphaOffset) / (maxAlphaOffset - minAlphaOffset); // if (offset <= 0) { // self.Naviews.alpha = 0.0; // }else{ // self.Naviews.alpha = alpha; // NSLog(@"%f",alpha); // // }或者: if (offset <= 0) { self.Naviews.alpha = 0.0; }else{ self.Naviews.alpha = offset/maxAlphaOffset; NSLog(@"%f",alpha); } }
第二种方式便是,运行时动态绑定
我们可以在运行时动态绑定他的背景视图,然后设置他的背景透明度,网上有一个通过类别方式动态绑定实现导航栏颜色渐变的三方框架,感兴趣的朋友可以自行去研究研究LTNavigation。
第三便是直接获取那张ImageView,然后设置他的透明度。
其实我们从结构图中可以看出来,它是NavigationBar的子视图,我们可以通过for…in循环遍历navigationBar.subviews,然后获得这个view。
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //设置透明导航栏 UIView *barImageView = self.navigationController.navigationBar.subviews.firstObject; barImageView.alpha = 0.0; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat minAlphaOffset = - 88; CGFloat maxAlphaOffset = 200; CGFloat offset = scrollView.contentOffset.y; CGFloat alpha; if (offset <= 0) { alpha = 0.0; } else { alpha = (offset - minAlphaOffset) / (maxAlphaOffset - minAlphaOffset); } UIView *barImageView = self.navigationController.navigationBar.subviews.firstObject; barImageView.alpha = alpha; }