本文主要是介绍导航栏渐变透明下拉image放大,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、首先使用分类 对UINavigationBar 进行类扩展
@interface UINavigationBar (Background)- (void)cnSetBackgroundColor:(UIColor *)backgroundColor;- (void)cnReset;@end
#import "UINavigationBar+Background.h"
#import <objc/runtime.h>@implementation UINavigationBar (Background)static char overlayKey;- (UIView *)overlay{return objc_getAssociatedObject(self, &overlayKey);
}- (void)setOverlay:(UIView *)overlay{objc_setAssociatedObject(self, &overlayKey,overlay,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}- (void)cnSetBackgroundColor:(UIColor *)backgroundColor{if (!self.overlay) {[self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];self.overlay = [[UIView alloc] initWithFrame:CGRectMake(0, -20, [UIScreen mainScreen].bounds.size.width, CGRectGetHeight(self.bounds)+20)];self.overlay.userInteractionEnabled = NO;self.overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;[self insertSubview:self.overlay atIndex:0];}self.overlay.backgroundColor = backgroundColor;
}/*** 释放*/
- (void)cnReset{[self setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];[self.overlay removeFromSuperview];self.overlay = nil;
}
2、在当前控制器中写入对UINavigationBar 与 图片的处理
#import "XXTableViewViewController.h"
#import "UINavigationBar+Background.h"#define SCREEN_RECT [UIScreen mainScreen].bounds
static const CGFloat headerImageHeight = 260.0f;@interface XXTableViewViewController ()<UITableViewDataSource,UITableViewDelegate>
{// 拉伸的底图UIImageView *headerImageView;
}
@end@implementation XXTableViewViewController- (void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];self.mTableView.delegate = self;
}- (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];self.mTableView.delegate = nil;
}- (void)viewDidLoad {[super viewDidLoad];self.title = @"呵呵呵呵~~";//1、 去掉navigationbar 上的背景图片[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];//1.1、 去掉navigationbar 上图片下面的线self.navigationController.navigationBar.shadowImage = [UIImage new];self.mTableView.contentInset = UIEdgeInsetsMake(headerImageHeight, 0, 0, 0);self.mTableView.tableHeaderView = [[UIView alloc] init];headerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,-headerImageHeight,CGRectGetWidth(SCREEN_RECT), headerImageHeight)];headerImageView.image = [UIImage imageNamed:@"headerImage"];// 高度改变 宽高也跟着改变headerImageView.contentMode = UIViewContentModeScaleToFill;//重点(不设置拿奖只会被纵向拉伸)// 设置autoresizesSubView让子类自动布局。headerImageView.autoresizesSubviews = YES;[self.mTableView addSubview:headerImageView];
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return 50;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *string = @"cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:string];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:string];}cell.textLabel.text = [NSString stringWithFormat:@"========>%ld",(long)indexPath.row];return cell;
}- (void)scrollViewDidScroll:(UIScrollView *)scrollView{/*** 处理头部图片拉伸放大效果*/CGFloat y = scrollView.contentOffset.y + 64;if (y < -headerImageHeight) {CGRect rect = headerImageView.frame;rect.origin.y = y;rect.size.height = - y;headerImageView.frame = rect;}/*** 处理Navigationbar 背景图片渐变效果*/UIColor *color = [UIColor colorWithRed:0.5 green:0.5 blue:1 alpha:1];CGFloat offsetY = scrollView.contentOffset.y + headerImageHeight;// Y轴大于0 设置navigationbar的透明度if (offsetY >0) {CGFloat alpha = MIN(1, offsetY/(headerImageHeight - 64));[self.navigationController.navigationBar cnSetBackgroundColor:[color colorWithAlphaComponent:alpha]];[self setNavigationColor:offsetY];} else {[self.navigationController.navigationBar cnSetBackgroundColor:[color colorWithAlphaComponent:0]];[self setNavigationColor:offsetY];}
}#pragma mark 重写状态栏的方法
/**为了适配IOS9 需要在 .pList文件里添加View controller-based status bar appearance 设置为 NO 默认为 YES*/
- (void)setNavigationColor:(CGFloat)floatY{if (floatY >= 180) {//状态栏˝˝[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];//标题颜色self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};//导航栏子控件颜色self.navigationController.navigationBar.tintColor = [UIColor whiteColor];}else{//状态栏[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];//标题颜色self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor blackColor]};//导航栏子控件颜色self.navigationController.navigationBar.tintColor = [UIColor blackColor];}
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}
注意:当离开界面需要把TableView的代理方法取消掉 ,因为如果不取消掉的话 离开界面后还是会调用一次 scrollViewDidScroll 方法。
Demo 地址:https://github.com/xiangxianxiao/XXNavigationBarColor
这篇关于导航栏渐变透明下拉image放大的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!