渐变即由透明到显现,由看得见到消失不见
原理: UIScrollView的偏移量,作差值公式的alpha变化设置导航栏及其子视图的颜色和透明度的变化
1.去除导航栏及其底部一根碍眼的线
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//去掉导航栏与self.view中间的那根线
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
UINavigationBar * navigationBar = [UINavigationBar appearance];
navigationBar.backgroundColor = [UIColor clearColor];
navigationBar.barTintColor = [UIColor clearColor];
}
2. 恢复全局的导航栏设置,不可能说每个页面都是渐变的,如果有那就当我没说
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
UINavigationBar * navigationBar = [UINavigationBar appearance];
navigationBar.barTintColor = [UIColor orangeColor];
navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor], NSFontAttributeName : [UIFont systemFontOfSize: 15]};
}
3. 插值算法 这里的kNavBarHeight
是导航栏+状态栏的高度,当然也可以是你自定义视图的高度,只是一个定值,用于计算alpha(可以这么理解,往下拽的时候是透明的,往上推的时候到某一个点的时候就开始变色了,变着变着就不变了...)
CGFloat offsetY = scrollView.contentOffset.y;
UIColor *color = [UIColor blueColor];
if (offsetY > kNavBarHeight) {
if (offsetY > kNavBarHeight*2) {
offsetY = kNavBarHeight*2;
}
CGFloat alpha = (offsetY - kNavBarHeight)/kNavBarHeight;
//各种视图透明度设置为alpha
}else{
//各种视图设置为透明
}
网友评论