国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > iOS > 正文

iOS實(shí)現(xiàn)簡(jiǎn)單的頭部縮放功能

2019-10-21 18:39:57
字體:
供稿:網(wǎng)友

本文通過實(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)思路,如有符合可直接使用。

效果如下圖。

iOS,頭部縮放

實(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,僅供參考,如有問題請(qǐng)留言

Demo地址:

https://github.com/yongliangP/YLSpringHeader 用心良苦請(qǐng) star

總結(jié)

以上所述是小編給大家介紹的iOS實(shí)現(xiàn)簡(jiǎn)單的頭部縮放功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 固原市| 浙江省| 顺义区| 息烽县| 北海市| 蕲春县| 巴塘县| 宝鸡市| 盈江县| 博罗县| 伊宁市| 临泽县| 大荔县| 萍乡市| 祁门县| 鱼台县| 西畴县| 渭南市| 成安县| 苍山县| 盐城市| 怀远县| 蓝田县| 宜宾县| 贵德县| 拉萨市| 新沂市| 南投县| 冷水江市| 海南省| 平顶山市| 象州县| 鄂托克旗| 弥渡县| 怀安县| 罗定市| 龙川县| 井冈山市| 九江市| 新和县| 红原县|