iOS實(shí)現(xiàn)簡(jiǎn)單的頭部縮放功能
本文通過(guò)實(shí)例代碼給大家介紹了iOS實(shí)現(xiàn)簡(jiǎn)單的頭部縮放功能。實(shí)現(xiàn)思路有頭部視圖,滾動(dòng)視圖,控制頭部動(dòng)畫等多個(gè)示例代碼塊,大家可以參考下本文。
簡(jiǎn)單實(shí)現(xiàn)并集成一個(gè)頭部縮放的功能,適用于UIScrollView以及其子類。
頭部伴隨模糊效果放大縮小,并在一定位置時(shí)懸停充當(dāng)導(dǎo)航欄。這里提供實(shí)現(xiàn)思路,如有符合可直接使用。
效果如下圖。
實(shí)現(xiàn):
首先分解為兩部分,一部分為頭部視圖,一部分為滾動(dòng)視圖。頭部視圖負(fù)責(zé)展示,滾動(dòng)視圖負(fù)責(zé)控制頭部視圖如何展示,比如放大和縮小。
一:頭部視圖
頭部視圖拆解為負(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];
二:滾動(dòng)視圖
滾動(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];
三:控制頭部動(dòng)畫
和其他的滾動(dòng)視圖做動(dòng)畫一樣,實(shí)現(xiàn)滾動(dòng)視圖的代理方法scrollViewDidScroll,獲取偏移量,然后根據(jù)一定的規(guī)則做動(dòng)畫,這里為了解耦,也為了復(fù)用,使用了在scrollView的分類中監(jiān)聽scrollView的contentOffset方法去實(shí)現(xiàn)動(dòng)畫控制。
首先確定兩個(gè)臨界點(diǎn): 視圖的初始高度 懸停的高度。
示例代碼(簡(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&α<=1) { self.headerEffectView.alpha = alpha; } }
最重要的,記得在控制器dealloc時(shí)移除監(jiān)聽者
最重要的,記得在控制器dealloc時(shí)移除監(jiān)聽者
最重要的,記得在控制器dealloc時(shí)移除監(jiān)聽者
或者你有更好的方式移除監(jiān)聽者請(qǐng)告訴我。
照例放Demo,僅供參考,如有問(wèn)題請(qǐng)留言
Demo地址:
https://github.com/yongliangP/YLSpringHeader 用心良苦請(qǐng) star
總結(jié)
以上所述是小編給大家介紹的iOS實(shí)現(xiàn)簡(jiǎn)單的頭部縮放功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法
- iOS實(shí)現(xiàn)點(diǎn)擊微信頭像(放大、縮放、保存)效果
- iOS手勢(shì)識(shí)別的詳細(xì)使用方法(拖動(dòng),縮放,旋轉(zhuǎn),點(diǎn)擊,手勢(shì)依賴,自定義手勢(shì))
- iOS UITableView展開縮放動(dòng)畫實(shí)例代碼
- iOS應(yīng)用開發(fā)中對(duì)UIImage進(jìn)行截取和縮放的方法詳解
- iOS應(yīng)用開發(fā)中使用UIScrollView控件來(lái)實(shí)現(xiàn)圖片縮放
- iOS開發(fā)中Quartz2D控制圓形縮放和實(shí)現(xiàn)刷幀效果
相關(guān)文章
iOS 下拉刷新動(dòng)畫的實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了iOS 下拉刷新動(dòng)畫的實(shí)現(xiàn)實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Android開發(fā)筆記之簡(jiǎn)單基站定位程序的實(shí)現(xiàn)
這篇文章主要介紹了Android開發(fā)筆記之簡(jiǎn)單基站定位程序的實(shí)現(xiàn),詳細(xì)的介紹了基站定位其實(shí)很簡(jiǎn)單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11iOS中使用UISearchBar控件限制輸入字?jǐn)?shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了iOS中使用UISearchBar控件限制輸入字?jǐn)?shù)的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2016-08-08iOS?UITextView?實(shí)現(xiàn)類似微博的話題、提及用戶效果
這篇文章主要介紹了iOS?UITextView?實(shí)現(xiàn)類似微博的話題、提及功能,基本思路是使用正則匹配出成對(duì)的#,再利用UITextView的富文本實(shí)現(xiàn)高亮效果,需要的朋友可以參考下2022-06-06iOS中tableview實(shí)現(xiàn)編輯、全選及刪除等功能的方法示例
這篇文章主要給大家介紹了關(guān)于iOS中tableview實(shí)現(xiàn)編輯、全選及刪除等功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),不僅是介紹實(shí)現(xiàn)的方法,將實(shí)現(xiàn)過(guò)程中遇到的問(wèn)題也都分享出來(lái)了,需要的朋友們下面來(lái)一起看看吧。2017-07-07iOS 斷點(diǎn)上傳文件的實(shí)現(xiàn)方法
這項(xiàng)目開發(fā)中,有時(shí)候我們需要將本地的文件上傳到服務(wù)器,簡(jiǎn)單的幾張圖片還好,但是針對(duì)iPhone里面的視頻文件進(jìn)行上傳,為了用戶體驗(yàn),我們有必要實(shí)現(xiàn)斷點(diǎn)上傳。這篇文章主要介紹了iOS 斷點(diǎn)上傳文件的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-12-12