iOS 仿知乎/途家導(dǎo)航欄漸變文字動(dòng)畫(huà)效果

iOS導(dǎo)航欄知乎漸變

效果圖如上,簡(jiǎn)單分析下

1.導(dǎo)航欄一開(kāi)始是隱藏的,隨著scrollView滾動(dòng)而漸變

2.導(dǎo)航欄左右兩邊的navigationItem是一直顯示的

3.導(dǎo)航欄參考了途家app,使用了毛玻璃效果,背景是一張圖片

4.下拉放大圖片效果

5.title文字動(dòng)畫(huà)效果

通過(guò)簡(jiǎn)單分析,系統(tǒng)的導(dǎo)航欄實(shí)現(xiàn)以上效果有點(diǎn)困難,直接自定義一個(gè)假的導(dǎo)航欄更容易點(diǎn)

分布拆解實(shí)現(xiàn)以上效果

一.下拉放大header圖片

?(void)viewDidLoad?{

[super?viewDidLoad];

[self.view?addSubview:self.scaleImageView];

//?設(shè)置展示圖片的約束

[_scaleImageView?mas_makeConstraints:^(MASConstraintMaker?*make)?{

make.top.mas_equalTo(0);

make.left.equalTo(self.view.mas_left);

make.right.equalTo(self.view.mas_right);

make.height.mas_equalTo(kHeardH);

}];

}

//?tableView懶加載

-(UITableView?*)tableView{

if(_tableView?==?nil){

_tableView?=?[[UITableView?alloc]initWithFrame:self.view.bounds?style:UITableViewStylePlain];

_tableView.contentInset?=?UIEdgeInsetsMake(kHeardH-35,?0,?0,?0);

_tableView.delegate?=?self;

_tableView.dataSource?=?self;

_tableView.separatorStyle?=?UITableViewCellSeparatorStyleNone;

}

return_tableView;

}

//?圖片的懶加載

-?(UIImageView?*)scaleImageView

{

if(!_scaleImageView)?{

_scaleImageView?=?[[UIImageView?alloc]?init];

_scaleImageView.contentMode?=?UIViewContentModeScaleAspectFill;

_scaleImageView.clipsToBounds?=?YES;

_scaleImageView.image?=?[UIImage?imageNamed:@"666"];

}

return_scaleImageView;

}

//?導(dǎo)航欄高度

#define?kNavBarH?64.0f

//?頭部圖片的高度

#define?kHeardH??260

#pragma?mark?-?UIScrollViewDelegate

-?(void)scrollViewDidScroll:(UIScrollView?*)scrollView?{

//?計(jì)算當(dāng)前偏移位置

CGFloat?offsetY?=?scrollView.contentOffset.y;

CGFloat?delta?=?offsetY?-?_lastOffsetY;

DLog(@"delta=%f",delta);

DLog(@"offsetY=%f",offsetY);

CGFloat?height?=?kHeardH?-?delta;

if(height?<?kNavBarH)?{

height?=?kNavBarH;

}

[_scaleImageView?mas_updateConstraints:^(MASConstraintMaker?*make)?{

make.height.mas_equalTo(height);

}];

}

二.導(dǎo)航欄左右兩邊的navigationItem是一直顯示的

?(void)viewDidLoad?{

[super?viewDidLoad];

//?直接添加到控制器的View上面,注意添加順序,在添加導(dǎo)航欄之后,否則會(huì)被遮蓋住

[self?configNavigationBar];

}

-?(void)configNavigationBar{

//左邊返回按鈕

UIButton?*backBtn?=?[[UIButton?alloc]init];

backBtn.frame?=?CGRectMake(0,?20,?44,?44);

[backBtn?setImage:[UIImage?imageNamed:@"special_back"]?forState:UIControlStateNormal];

[backBtn?addTarget:self?action:@selector(back)?forControlEvents:UIControlEventTouchUpInside];

//右邊分享按鈕

UIButton?*shartBtn?=?[[UIButton?alloc]init];

shartBtn.frame?=?CGRectMake(SCREENWIDTH-44,?20,?44,?44);

[shartBtn?setImage:[UIImage?imageNamed:@"special_share"]?forState:UIControlStateNormal];

[shartBtn?addTarget:self?action:@selector(shareBtnClick)?forControlEvents:UIControlEventTouchUpInside];

[self.view?addSubview:backBtn];

[self.view?addSubview:shartBtn];

}

//?返回

-(void)back{

[self.navigationController?popViewControllerAnimated:YES];

}

三.自定義導(dǎo)航欄及毛玻璃效果及title文字動(dòng)畫(huà)效果

1//?隱藏系統(tǒng)導(dǎo)航欄

-?(void)viewWillAppear:(BOOL)animated{

[super?viewWillAppear:animated];

self.navigationController.navigationBar.hidden?=?YES;

}

-?(void)viewDidLoad?{

[super?viewDidLoad];

self.navigationController.navigationBar.hidden?=?YES;

self.lastOffsetY?=?-?kHeardH+35;

[self.view?addSubview:self.tableView];

self.tableView.backgroundColor?=?[UIColor?clearColor];

[self.view?addSubview:self.navigationView];

self.navigationController.navigationBar.barStyle?=?UIBarStyleBlack;

}

//?自定義導(dǎo)航欄

-(UIView?*)navigationView{

if(_navigationView?==?nil){

_navigationView?=?[[UIView?alloc]init];

_navigationView.frame?=?CGRectMake(0,?0,?SCREENWIDTH,?kNavBarH);

_navigationView.backgroundColor?=?[UIColor?clearColor];

_navigationView.alpha?=?0.0;

//添加子控件

[self?setNavigationSubView];

}

return_navigationView;

}

//?注意:毛玻璃效果API是iOS8的,適配iOS8以下的請(qǐng)用其他方法

-(void)setNavigationSubView{

//?毛玻璃背景

UIImageView?*bgImgView?=?[[UIImageView?alloc]?initWithFrame:_navigationView.bounds];

bgImgView.image?=?[UIImage?imageNamed:@"666"];

[_navigationView?addSubview:bgImgView];

/**??毛玻璃特效類型

*???UIBlurEffectStyleExtraLight,

*???UIBlurEffectStyleLight,

*???UIBlurEffectStyleDark

*/

UIBlurEffect?*?blurEffect?=?[UIBlurEffect?effectWithStyle:UIBlurEffectStyleDark];

//??毛玻璃視圖

UIVisualEffectView?*?effectView?=?[[UIVisualEffectView?alloc]?initWithEffect:blurEffect];

//添加到要有毛玻璃特效的控件中

effectView.frame?=?bgImgView.bounds;

[bgImgView?addSubview:effectView];

//設(shè)置模糊透明度

effectView.alpha?=?0.9f;

//中間文本框

UIView?*centerTextView?=?[[UIView?alloc]init];

self.centerTextView?=?centerTextView;

CGFloat?centerTextViewX?=?0;

CGFloat?centerTextViewY?=?64;

CGFloat?centerTextViewW?=?0;

CGFloat?centerTextViewH?=?0;

//文字大小

NSString?*title?=?@"Pg.lostk開(kāi)啟后搖滾的新圖景";

NSString?*desc??=?@"搖滾清心坊8套";

CGSize?titleSize?=?[title?sizeWithAttributes:@{NSFontAttributeName:[UIFont?systemFontOfSize:12]}];

CGSize?descSize?=?[desc?sizeWithAttributes:@{NSFontAttributeName:[UIFont?systemFontOfSize:11]}];

centerTextViewW?=?titleSize.width?>?descSize.width???titleSize.width?:?descSize.width;

centerTextViewH?=?titleSize.height?+?descSize.height?+10;

centerTextViewX?=?(SCREENWIDTH?-?centerTextViewW)?/?2;

centerTextView.frame?=?CGRectMake(centerTextViewX,?centerTextViewY,?centerTextViewW,?centerTextViewH);

//文字label

UILabel?*titleLabel?=?[[UILabel?alloc]init];

titleLabel.text?=?title;

titleLabel.font?=?[UIFont?systemFontOfSize:12];

titleLabel.textColor?=?[UIColor?whiteColor];

titleLabel.frame?=?CGRectMake(0,5,?centerTextViewW,?titleSize.height);

UILabel?*descLabel?=?[[UILabel?alloc]init];

descLabel.textAlignment?=?NSTextAlignmentCenter;

descLabel.text?=?desc;

descLabel.font?=?[UIFont?systemFontOfSize:11];

descLabel.textColor?=?[UIColor?whiteColor];

descLabel.frame?=?CGRectMake(0,?titleSize.height?+?5,?centerTextViewW,?descSize.height);

[centerTextView?addSubview:titleLabel];

[centerTextView?addSubview:descLabel];

[_navigationView?addSubview:centerTextView];

}

聲明控件


@property(nonatomic,strong)?UIView?*navigationView;//?導(dǎo)航欄

@property(nonatomic,strong)?UIView?*centerTextView;//?title文字

@property?(assign,?nonatomic)?CGFloat?lastOffsetY;//?記錄上一次位置

@property?(nonatomic,strong)?UIImageView?*scaleImageView;//?頂部圖片

核心代碼

#pragma?mark?-?ScrollViewDelegate

-?(void)scrollViewDidScroll:(UIScrollView?*)scrollView?{

//?計(jì)算當(dāng)前偏移位置

CGFloat?offsetY?=?scrollView.contentOffset.y;

CGFloat?delta?=?offsetY?-?_lastOffsetY;

DLog(@"delta=%f",delta);

DLog(@"offsetY=%f",offsetY);

CGFloat?height?=?kHeardH?-?delta;

if(height?<?kNavBarH)?{

height?=?kNavBarH;

}

CGFloat?margin?=?205;

if(delta>margin?&&?deltamargin+39)?{

self.centerTextView.y?=?25;

self.centerTextView.alpha?=?1.0;

}

if(delta<=margin)?{

self.centerTextView.alpha?=?0;

}

if(delta=?1.0)?{

alpha?=?1.0;

}

self.navigationView.alpha?=?alpha;

}

由于是直接寫(xiě)項(xiàng)目中,沒(méi)有demo可供下載,抱歉,如果有更好的方法實(shí)現(xiàn),希望不吝賜教,共勉!!!

文章轉(zhuǎn)自船長(zhǎng)_的簡(jiǎn)書(shū)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容