<iOS 导航栏>第一节:导航栏透明方法实现代码
@interface IDSNavBarView : UIView
- (instancetype)initWithFrame:(CGRect)frame titleImg:(UIImage *)aTitleImg;
- (UILabel *)titleLabel;
- (void)animateByOffsetY:(CGFloat)offsety;
/**
语音房间新增方法,用于外部触发更改左右图片和标题
@param title 标题内容
*/
- (void)changeButtonImage;
- (void)changeButtonImagelight;
- (void)changeTitleName:(NSString *)title;
@property (nonatomic, strong) NSString *backImageName;
@property (nonatomic, strong) NSString *reportImageName;
@property (nonatomic, strong) NSString *backImageName_light;
@property (nonatomic, strong) NSString *reportImageName_light;
@property (nonatomic, copy) dispatch_block_t onBackActionBlock;
@property (nonatomic, copy) dispatch_block_t onReportBlock;
@property (nonatomic, assign) BOOL enableBackBtn;
@property (nonatomic, assign) BOOL enableReportBtn;
@property (nonatomic, assign) BOOL enableTransparent;
@end
@interfaceIDSNavBarView ()
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIImageView *titleImgView;
@property (nonatomic, strong) UIImage *titleImg;
@property (nonatomic, strong) UIButton *backBtn;
@property (nonatomic, strong) UIButton *reportBtn;
@property (nonatomic, strong) UIView *backgroundView;
@property (nonatomic, strong) UIView *maskLine;
@end
@implementation IDSNavBarView
- (instancetype)initWithFrame:(CGRect)frame
{
return [selfinitWithFrame:frame titleImg:nil];
}
- (instancetype)initWithFrame:(CGRect)frame titleImg:(UIImage *)aTitleImg
{
self = [superinitWithFrame:frame];
if (self) {
_titleImg = aTitleImg;
[selfsetupViews];
/// 默认不显示
self.alpha = 1;
}
returnself;
}
//改变导航栏透明按钮时的显示状态
- (void)changeButtonImage
{
UIImage *backImg = ImageNamed(@"ic_global_return_light");
if (!IS_NS_STRING_EMPTY(self.backImageName)) {
backImg = ImageNamed(self.backImageName);
}
[self.backBtn setImage:backImg forState:UIControlStateNormal];
[self.backBtn setImage:backImg forState:UIControlStateHighlighted];
UIImage *reportImg = ImageNamed(@"ic_navbar_point_light");
if (!IS_NS_STRING_EMPTY(self.reportImageName)) {
reportImg = ImageNamed(self.reportImageName);
}
[self.reportBtn setImage:reportImg forState:UIControlStateNormal];
[self.reportBtn setImage:reportImg forState:UIControlStateHighlighted];
}
//改变导航栏透明按钮滑到后期改变时的显示状态(不声明代表不改变按钮状态)
- (void)changeButtonImagelight
{
UIImage *backImg = ImageNamed(@"ic_global_return");
if (!IS_NS_STRING_EMPTY(self.backImageName_light)) {
backImg = ImageNamed(self.backImageName_light);
}
[self.backBtnsetImage:backImg forState:UIControlStateNormal];
UIImage *reportImg = ImageNamed(@"ic_navbar_point_dark");
if (!IS_NS_STRING_EMPTY(self.reportImageName_light)) {
reportImg = ImageNamed(self.reportImageName_light);
}
[self.reportBtn setImage:reportImg forState:UIControlStateNormal];
}
//使用此方法自定义标题label
- (void)changeTitleName:(NSString *)title
{
if (!IS_NS_STRING_EMPTY(title)) {
self.titleLabel.alpha = 1;
self.titleLabel.textColor = NF_Color_C1;
self.titleLabel.text = title;
}
[self bringSubviewToFront:self.titleLabel];
}
//透明位移,按照滚动的位移使导航栏渐渐从透明到非透明状态
- (void)animateByOffsetY:(CGFloat)offsety
{
CGFloat fitHeight = 156;
self.alpha = 1;
self.backgroundView.alpha = offsety/fitHeight;
self.titleLabel.alpha = offsety/fitHeight;
self.maskLine.alpha = offsety/fitHeight;
if (self.backgroundView.alpha > 0.7) {
[self changeButtonImagelight];
}
else {
[self changeButtonImage];
}
}
//导航栏左侧返回按钮按钮
- (void)doBackAction:(id)sender
{
if (self.onBackActionBlock) {
self.onBackActionBlock();
}
}
//导航栏右侧按钮按钮
- (void)doReportAction:(id)sender
{
if (self.onReportBlock) {
self.onReportBlock();
}
}
#pragma mark - Setup Views.
//自定义导航栏设置,若加入_enableTransparent属性,导航栏则显示透明,否则不显示透明状态
- (void)setupViews
{
self.titleLabel.backgroundColor = [UIColorclearColor];
self.backgroundColor = [UIColorclearColor];
self.backgroundView = [[UIViewalloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 64)];
self.backgroundView.backgroundColor = [UIColorwhiteColor];
[selfaddSubview:self.backgroundView];
//self.backgroundColor = NF_Color_C1;
self.clipsToBounds = YES;
if (nil == self.titleImg) {
/// 添加 title.
{
[self addSubview:self.titleLabel];
[self.titleLabelmas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self.mas_centerX);
make.left.mas_equalTo(self).offset(50.0f);
make.right.mas_equalTo(self).offset(-50.0f);
make.centerY.mas_equalTo(self.mas_centerY).offset(5.0f);
}];
}
}
else {
/// 设置image
{
self.titleImgView.image = self.titleImg;
[self addSubview:self.titleImgView];
[self.titleImgViewmas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(self.width-20, self.height-10));
make.centerX.mas_equalTo(self.mas_centerX);
make.centerY.mas_equalTo(self.mas_centerY).mas_offset(6);
}];
}
}
/// 添加分割线.
{
_maskLine = [[UIViewalloc] init];
_maskLine.backgroundColor = NF_Color_C9;
self.maskLine.alpha = 0;
[selfaddSubview:_maskLine];
[_maskLinemas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(self.width, 0.5f));
make.left.with.right.with.bottom.mas_offset(0.f);
}];
}
if(_enableTransparent) {
self.backgroundView.alpha = 0;
self.titleLabel.alpha = 0;
self.maskLine.alpha = 0;
}
else {
self.backgroundView.alpha = 1;
self.titleLabel.alpha = 1;
self.maskLine.alpha = 1;
}
}
//用set方法声明,通过声明 BOOL 变量enableBackBtn 来表明是否需要后退按键
- (void)setEnableBackBtn:(BOOL)enableBackBtn
{
if (![self.backBtnsuperview]) {
[self addSubview:self.backBtn];
[self.backBtnmas_makeConstraints:^(MASConstraintMaker *make) {
//make.size.mas_equalTo(CGSizeMake(self.backBtn.imageView.image.size.width, self.backBtn.imageView.image.size.height));
make.size.mas_equalTo(CGSizeMake(50, 50));
make.left.mas_equalTo(self).mas_offset(0.f);
make.centerY.mas_equalTo(self.mas_centerY).mas_offset(6.f);
}];
}
if (enableBackBtn) {
self.backBtn.hidden = NO;
}
else {
self.backBtn.hidden = YES;
}
}
//用set方法声明,通过声明 BOOL 变量透明来表明是否需要后退按键
- (void)setEnableTransparent:(BOOL)enableTransparent
{
if (enableTransparent) {
self.backgroundView.alpha = 0;
self.titleLabel.alpha = 0;
self.maskLine.alpha = 0;
}
else {
self.backgroundView.alpha = 1;
self.titleLabel.alpha = 1;
self.maskLine.alpha = 1;
}
}
//用set方法声明,是否需要右键
- (void)setEnableReportBtn:(BOOL)enableReportBtn
{
if (![self.reportBtnsuperview]) {
[self addSubview:self.reportBtn];
[self.reportBtnmas_makeConstraints:^(MASConstraintMaker *make) {
//CGSize imgSize = self.reportBtn.imageView.image.size;
//make.size.mas_equalTo(CGSizeMake(imgSize.width, imgSize.height));
make.size.mas_equalTo(CGSizeMake(50, 50));
make.right.mas_equalTo(self).mas_offset(-0.f);
make.centerY.mas_equalTo(self.mas_centerY).mas_offset(6.f);
}];
}
if (enableReportBtn) {
self.reportBtn.hidden = NO;
}
else {
self.reportBtn.hidden = YES;
}
}
#pragma mark - Setter & Getter.
- (UILabel *)titleLabel
{
if (nil == _titleLabel) {
_titleLabel = [[UILabelalloc] init];
}
_titleLabel.font = [UIFontboldSystemFontOfSize:Near_Final_Font_T7];
_titleLabel.textAlignment = NSTextAlignmentCenter;
_titleLabel.numberOfLines = 1;
return_titleLabel;
}
- (UIImageView *)titleImgView
{
if (nil == _titleImgView) {
_titleImgView = [[UIImageViewalloc] init];
_titleImgView.contentMode = UIViewContentModeScaleAspectFit;
}
return_titleImgView;
}
- (UIButton *)backBtn
{
if (nil == _backBtn) {
_backBtn = [UIButtonbuttonWithType:UIButtonTypeCustom];
UIImage *norImg = ImageNamed(@"ic_global_return_light");
if (!IS_NS_STRING_EMPTY(self.backImageName)) {
norImg = ImageNamed(self.backImageName);
}
UIImage *highImg = [norImg cl_imageByApplyingAlpha:0.3f];
[_backBtn setImage:norImg forState:UIControlStateNormal];
[_backBtn setImage:highImg forState:UIControlStateHighlighted];
[_backBtn addTarget:selfaction:@selector(doBackAction:) forControlEvents:UIControlEventTouchUpInside];
}
return_backBtn;
}
- (UIButton *)reportBtn
{
if (nil == _reportBtn) {
_reportBtn = [UIButtonbuttonWithType:UIButtonTypeCustom];
UIImage *norImg = ImageNamed(@"ic_navbar_point_light");
if (!IS_NS_STRING_EMPTY(self.reportImageName)) {
norImg = ImageNamed(self.reportImageName);
}
UIImage *highImg = [norImg cl_imageByApplyingAlpha:0.3f];
[_reportBtn setImage:norImg forState:UIControlStateNormal];
[_reportBtn setImage:highImg forState:UIControlStateHighlighted];
[_reportBtn addTarget:selfaction:@selector(doReportAction:) forControlEvents:UIControlEventTouchUpInside];
}
return _reportBtn;
}
@end
_barView = [[IDSNavBarViewalloc] initWithFrame:barFrame];
self.barView.enableBackBtn = YES;
self.barView.enableTransparent = YES;
@weakify(self);
self.barView.onBackActionBlock = ^{
@strongify(self);
[self goBack];//返回操作,上个章节有讲解
};
self.barView.enableReportBtn = YES;
self.barView.enableReportBtn = NO;
self.barView.onReportBlock = ^{
@strongify(self);
[self moreButtonAction]; //导航栏右侧按钮的点击方法
};
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:NO];
}
{
// 处理导航栏
CGFloat distY = scrollView.contentOffset.y;
[self.barViewanimateByOffsetY:distY];
}
<iOS 导航栏>第一节:导航栏透明方法实现代码的更多相关文章
- OATable中column栏位数据居中的实现方法及代码
// Table column中显示居中的实现 // QpriceResultTable1 为table的名称 // noPrice 为table中的列 OATableBean table = (OA ...
- 【iOS开发-22】navigationBar导航栏,navigationItem建立:获取导航栏中的基本文本和button以及各种跳跃
(1)navigationBar导航栏可以被看作是self.navigationController一个属性导航控制器,它可以由点直接表示self.navigationController.navig ...
- iOS开发笔记1:[转]导航栏里的"Back"按钮显示不出来
最近项目中遇到一个问题,push过去的ViewController的Nav上面没有返回按钮,遂搜索资料,找到了以下文档.经测试i,问题解决. 原文地址:http://www.cnblogs.com/s ...
- iOS开发之 -- 判断tableview/scrollview的滑动方法,及导航栏渐变的实现代码
开发的过程中,肯定会用到在视图想上滑动的时候,在导航处做一些操作,比如向上滑动的时候,做个动画,出现一个搜索框,或者其他的操作,那么我们怎么来判断它的滑动方向呢? 首先我们应该知道tableview继 ...
- 仿酒仙网的一款jQuery侧栏弹出导航栏特效
仿酒仙网的一款jQuery侧栏弹出导航栏特效 一款常用于商城左侧商品导航的jquery菜单导航特效. 非常不错的一款商品分类特效.大家可以拿去研究研究 . 注意:该特效还支持挨千刀的IE6啊,之强大. ...
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- 【iOS开发-22】navigationBar导航条和navigationItem设置:基本搞定导航条上的文字和按钮以及各种跳转
http://blog.csdn.net/weisubao/article/details/39646739?utm_source=tuicool&utm_medium=referral (1 ...
- iOS仿今日头条滑动导航
之前写了篇博客网易首页导航封装类.网易首页导航封装类优化,今天在前两个的基础上仿下今日头条. 1.网易首页导航封装类中主要解决了上面导航的ScrollView和下面的页面的ScrollView联动的问 ...
随机推荐
- Spring异步方法注解 @Async
@Async 0. 介绍 在Spring 3.x之后,通过内置@Async标明异步方法,可以简化异步开发流程. @Async既可提供无返回值的调用,也可提供有返回值的调用,下文将分别介绍两种使用方式. ...
- An HTTP & HTTP/2 client for Android and Java applications OkHttp
HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP effic ...
- 【87.65%】【codeforces 731A】Night at the Museum
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【003】【Java虚拟机——对象死亡的判断】
对象死亡! 垃圾收集器在对堆进行回收前,首先要做的事情就是要确定这些对象之中哪些还"存活"着, 哪些已经"死去" (即不可能再被不论什么途径使用的对象). 1) 引用计 ...
- 并行编程OpenMP基础及简单示例
OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...
- WPF 3D模型的一个扩展方法
原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...
- ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 编辑表单 上一章节我们介绍了标签助手和 HT ...
- C类型和存储方式的语言变量
变量的作用域:有效射程变量 >局部变量 1.在函数中的局部变量,量在该函数结束后自己主动撤销 2.函数内的复合语句中的局部变量(比方for语句),这个变量在复合语句结束后自己主动撤销.这个变量能 ...
- doker基础
去 Docker Hub 上拉取一个叫 hello-world 的集装箱docker pull hello-world然后让这个集装箱跑起来docker run hello-world查看本机所安装的 ...
- System.Windows.Documents.Run
希望采用不同的方案来书写文字,可以使用多个TextBlock,也可以使用一个TextBlock+多个Run <TextBlock FontSize="12" Margin=& ...