主要實現(xiàn)原理:在導(dǎo)航欄的的位置上放置一個自定義的view,通過手勢操作來改變透明度.
自定義的view(通過繪圖的方式):
```javascript
- (void)drawRect:(CGRect)rect {
UIBezierPath*rectPath = [UIBezierPathbezierPathWithRect:rect];
[[UIColorwhiteColor]set];
[rectPathfill];
//畫線
// 1個點--> 2個像素(4s, 5, 6)
// 1個點--> 3個像素
//線高度
CGFloatlineH =1/[UIScreenmainScreen].scale;
CGFloatlineY = rect.size.height- lineH;
UIBezierPath*linePath = [UIBezierPathbezierPath];
//線的起點
[linePathmoveToPoint:CGPointMake(0, lineY)];
[linePathaddLineToPoint:CGPointMake(rect.size.width, lineY)];
[[UIColorpurpleColor]set];
[linePathstroke];
}
```
定義一些屬性:
YMSView即為自定義的view,作為新的導(dǎo)航欄,也就類似于一個遮罩的效果
myAlpha 作為修改導(dǎo)航欄的透明度(自定義的view)
mycolor是用來修改導(dǎo)航欄字體的顏色
imageview用來操作的一張圖片

懶加載的形式加載這個自定義的view
/導(dǎo)航欄view
-(YMSView*)myNavView
{
if(_myNavView==nil)
{
//64正好覆蓋住原來的view
YMSView*navView = [[YMSViewalloc]initWithFrame:CGRectMake(0,0, [UIScreenmainScreen].bounds.size.width,64)];
navView.backgroundColor= [UIColorwhiteColor];
navView.alpha=0;
[self.viewaddSubview:navView];
_myNavView= navView;
}
return_myNavView;
}
給當(dāng)前的根view添加拖拽手勢
-(void)addPanGesture
{
UIPanGestureRecognizer*panGesture = [[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(pan:)];
[self.viewaddGestureRecognizer:panGesture];
}
如何才能改變當(dāng)前導(dǎo)航欄的透明度和標(biāo)題顏色呢?
關(guān)節(jié)點就在拖拽手勢的實現(xiàn)中,通過拖拽距離來設(shè)置一個比例,在拖動中來動態(tài)改變
-(void)pan:(UIPanGestureRecognizer*)pan
{
//獲取當(dāng)前拖拽的距離
CGPointloc = [pantranslationInView:pan.view];
//讓view的tansform歸零,否則會一直疊加
[pansetTranslation:CGPointZeroinView:pan.view];
//更新圖片的約束
[_imageViewmas_updateConstraints:^(MASConstraintMaker*make) {
//計算圖片滾動的距離
CGFloatdistance =_imageView.height+ loc.y;
//放置圖片穿透到上面或者下拖拽的時候放大
//判斷滾動的距離
//此處判斷特別重要,這樣能解決拖拽過程中卡頓的現(xiàn)象
防止向下拖拽時放大圖片
if(distance >200)
{
return;
}
make.height.mas_equalTo(distance);
}];
//根據(jù)拖動的距離來改變導(dǎo)航欄的顏色
CGFloatmax =200;
CGFloatmin =64;
//求出顏色變化范圍
CGFloatcover = max - min;
//計算比例
//根據(jù)imageview高度的變化來計算
CGFloatscale =1- (_imageView.height- min)/cover;
//NSLog(@"%lf",_imageView.height);
self.myAlpha= scale;
self.mycolor=1-scale;
}
記得開始定義了一個透明度和顏色的屬性,通過重寫set方法,并在其中改變自定義view的透明度和字體的顏色
//導(dǎo)航欄矩形的透明度修改
-(void)setMyAlpha:(CGFloat)myAlpha
{
_myAlpha= myAlpha;
self.myNavView.alpha= myAlpha;
}
-(void)setMycolor:(CGFloat)mycolor
{
_mycolor= mycolor;
//設(shè)置文字的顏色
[self.navigationController.navigationBarsetTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColorcolorWithWhite:mycoloralpha:1]}];
//設(shè)置導(dǎo)航欄的渲染顏色
[self.navigationController.navigationBarsetTintColor:[UIColorcolorWithWhite:mycoloralpha:1]];
}
效果圖:

還有很多小細(xì)節(jié)沒有處理好,希望大家看到后能夠指出,一起分享下經(jīng)驗^_^ ?^_^