<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联动的问 ...
随机推荐
- LoadFromStr的使用中出现错误“未结束的字符串常量”
最近遇到个奇怪的问题,就是关于js参数中待换行符时,出现了错误“为结束的字符串常量”. 解决方法是:不直接将该数据以参数形式传递,而是先将其赋值在一个隐藏的文本内,需要调用的函数里只需读取该文本里的内 ...
- C# Color结构的各属性颜色对照表(转)
转自:http://blog.sina.com.cn/s/blog_454dc49501016q2p.html Color.AliceBlue 240,248,255 Color.LightSalmo ...
- Winsock出错引起的断网
背景 实验室有二十来台 PC 机,30+的服务器集群,网络拓扑比较复杂.简单地说,有网关连着校网,校网无法直接访问学校外的网络,只能通过拨 vpn 来实现外网访问.而校网最近也不稳定,时常断网. 今天 ...
- MapReduce 编程 系列七 MapReduce程序日志查看
首先,假设须要打印日志,不须要用log4j这些东西,直接用System.out.println就可以,这些输出到stdout的日志信息能够在jobtracker网站终于找到. 其次,假设在main函数 ...
- numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray)
1. np.asarray -- numpy 风格的类型转换 从已有多维数组创建新的多维数组,数据类型可重新设置 >> B = np.asarray(A, dtype='int32') 2 ...
- 用java写的后台方法可以提供给C#调用吗?(转)
最近和公司搞C#的同事联合搞了一个项目,我把我这边的数据加密之后传给C#,然后C#在对接收到的数据解密.可是问题来了,我这边用JAVA加密的数据C#的同事怎么也解密不出来,于是我就想到了可不可以将JA ...
- QT定时器的两种应用(QObject就有timerEvent事件,一种什么样的居心呢?)
QT中定时器的使用方法(1)重载timerEvent(QTimerEvent *)函数,然后再在类的构造函数中设置时间间隔 startTimer(50);//单位为毫秒(2)在类的构造函数中设定如 ...
- C. Adidas vs Adivon
C. Adidas vs Adivon Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer ...
- JScript读取XML文件
作者:朱金灿 来源:http://blog.csdn.net/clever101 JScript读取XML文件需要考虑msxml组件的多个版本,稳妥的做法是将所有版本都列出来. xml文件的内容如下: ...
- WPF中的多进程(Threading)处理实例(二)
原文:WPF中的多进程(Threading)处理实例(二) //错误的处理 private void cmdBreakRules_Click(object sender, RoutedEventArg ...