簡(jiǎn)單實(shí)現(xiàn)并集成一個(gè)頭部縮放的功能渣淤,適用于UIScrollView
以及其子類颖对。
頭部伴隨模糊效果放大縮小捻撑,并在一定位置時(shí)懸停充當(dāng)導(dǎo)航欄。這里提供實(shí)現(xiàn)思路缤底,如有符合可直接使用顾患。
效果如下圖。
<b>實(shí)現(xiàn):</b>
首先分解為兩部分个唧,一部分為頭部視圖江解,一部分為滾動(dòng)視圖。頭部視圖負(fù)責(zé)展示徙歼,滾動(dòng)視圖負(fù)責(zé)控制頭部視圖如何展示犁河,比如放大和縮小鳖枕。
<b>一:頭部視圖</b>
頭部視圖拆解為負(fù)責(zé)展示圖片的
UIImageView
,負(fù)責(zé)模糊效果的UIVisualEffectView
桨螺,負(fù)責(zé)標(biāo)題顯示的UILabel
宾符,以及返回等功能按鈕的UIButton
。進(jìn)一步分析灭翔,模糊效果的視圖應(yīng)該和展示圖片的視圖做同樣的處理魏烫,同樣的縮放,為了更好的控制將其包裝到一
containView
中肝箱。跟據(jù)滾動(dòng)的位置改變containView
的大小哄褒,模糊視圖根據(jù)滾動(dòng)的位置改變模糊的程度。標(biāo)題視圖在滾動(dòng)視圖到達(dá)一定位置時(shí)出現(xiàn)并停在那里煌张。這里利用UIImageView
的特性呐赡,改變它的contentMode
為UIViewContentModeScaleAspectFill
,這樣只用簡(jiǎn)單的改變圖片視圖的高度時(shí)就能營(yíng)造放大縮小的效果了唱矛。
UIImageView部分代碼
_blurImageView = [[UIImageView alloc] init];
_blurImageView.clipsToBounds = YES;
_blurImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
_blurImageView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_blurImageView];
UIVisualEffectView部分代碼
UIBlurEffect *beffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
_imageEffectView = [[UIVisualEffectView alloc]initWithEffect:beffect];
_imageEffectView.alpha = 0;
_imageEffectView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self addSubview:_imageEffectView];
<b>二:滾動(dòng)視圖</b>
滾動(dòng)視圖需要做的就是設(shè)置 contentInset
罚舱,讓出一部分空間給頭部視圖。這里如果將頭部視圖直接加到滾動(dòng)視圖上绎谦,無(wú)法做到頭部視圖最后懸停在一定位置管闷,因此直接加到和滾動(dòng)視圖同級(jí)就行。
示例代碼
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, kWindowWidth, kWindowHeight)];
self.webView.backgroundColor = [UIColor clearColor];
[self.view addSubview:self.webView];
NSURL * url = [NSURL URLWithString:@"https://yongliangp.github.io/"];
NSMutableURLRequest *re = [NSMutableURLRequest requestWithURL:url];
[self.webView loadRequest:re];
//初始化header
self.headerView.headerImage = [UIImage imageNamed:@"saber.jpeg"];
self.headerView.tittle = @"哈哈是個(gè)demo";
self.headerView.isShowLeftButton = YES;
self.headerView.isShowRightButton = YES;
__weak typeof(self) weakSelf = self;
self.headerView.leftClickBlock = ^(UIButton *btn){
[weakSelf.navigationController popViewControllerAnimated:YES];
};
self.headerView.rightClickBlock = ^(UIButton *btn){
NSLog(@"點(diǎn)擊了分享");
};
[self.webView.scrollView handleSpringHeadView:self.headerView];
<b>三:控制頭部動(dòng)畫(huà)</b>
和其他的滾動(dòng)視圖做動(dòng)畫(huà)一樣窃肠,實(shí)現(xiàn)滾動(dòng)視圖的代理方法scrollViewDidScroll
包个,獲取偏移量,然后根據(jù)一定的規(guī)則做動(dòng)畫(huà)冤留,這里為了解耦碧囊,也為了復(fù)用,使用了在scrollView
的分類中監(jiān)聽(tīng)scrollView
的contentOffset
方法去實(shí)現(xiàn)動(dòng)畫(huà)控制纤怒。
首先確定兩個(gè)臨界點(diǎn):<b>視圖的初始高度 懸停的高度糯而。</b>
示例代碼(簡(jiǎn)單控制)
- (void)yl_scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat offsetY = scrollView.contentOffset.y;
if (offsetY>=-kNavHeight)
{
offsetY=-kNavHeight;
if (self.headerView.frame.size.height!=kNavHeight)
{
self.headerView.frame = CGRectMake(0, 0, self.headerView.bounds.size.width, kNavHeight);
[UIView animateWithDuration:0.25 animations:^{
self.titleLabel.frame = CGRectMake(35, 20, self.bounds.size.width-35*2, 44);
self.titleLabel.alpha = 1;
}];
}
}else
{
self.headerView.frame = CGRectMake(0, 0, self.headerView.bounds.size.width, -offsetY);
if (self.titleLabel.alpha!=0)
{
[UIView animateWithDuration:0.25 animations:^{
self.titleLabel.frame = CGRectMake(35, 40, self.bounds.size.width-35*2, 44);
self.titleLabel.alpha = 0;
}];
}
}
CGFloat alpha ;
if (self.headerView.frame.size.height>=kWindowWidth/2)
{
alpha = 0;
}else
{
alpha = 1-((self.headerView.frame.size.height-kNavHeight)/(kWindowWidth/2-kNavHeight));
}
if (alpha>=0&&alpha<=1)
{
self.headerEffectView.alpha = alpha;
}
}
<b>最重要的,記得在控制器dealloc時(shí)移除監(jiān)聽(tīng)者</b>
<b>最重要的泊窘,記得在控制器dealloc時(shí)移除監(jiān)聽(tīng)者</b>
<b>最重要的熄驼,記得在控制器dealloc時(shí)移除監(jiān)聽(tīng)者</b>
或者你有更好的方式移除監(jiān)聽(tīng)者請(qǐng)告訴我。
照例放Demo烘豹,僅供參考瓜贾,如有問(wèn)題請(qǐng)留言
Demo地址:
https://github.com/yongliangP/YLSpringHeader 用心良苦請(qǐng) star
如果你覺(jué)得對(duì)你有幫助請(qǐng)點(diǎn) 喜歡 哦,也可以關(guān)注 我携悯,不定時(shí)更新(雖然現(xiàn)在不能保證更新量了祭芦,但會(huì)一直更??)。
或者關(guān)注 我的專題 每周至少5篇更新憔鬼,多謝支持哈龟劲。