iOS下拉放大上推縮小怎樣實(shí)現(xiàn)的
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
網(wǎng)上有很多類(lèi)似的demo,但都是分開(kāi)實(shí)現(xiàn)的,我把這兩個(gè)功能放到了一起,并且沒(méi)有使用AutoLayout,沒(méi)有用KVO,沒(méi)有用storyboard/xib。
我將重點(diǎn)數(shù)字使用的宏定義,擴(kuò)展性很強(qiáng)。
先來(lái)看看效果吧
實(shí)現(xiàn)思路:
1. 創(chuàng)建頭部的視圖和tableview,需要注意的是tableview要設(shè)置contentInset,contentInsent 的頂部要和頭部視圖的背景圖的高度一樣,否則會(huì)有空隙(或是有遮擋)。
myTableView.contentInset = UIEdgeInsetsMake(headRect.size.height-navHeight-navHeight, 0, 0, 0);
2. 對(duì)頭部視圖的背景圖片的尺寸進(jìn)行處理,當(dāng)然,你也可以直接找一個(gè)適合尺寸的圖片,就不用處理圖片了,為了增加程序的擴(kuò)展性,我就隨便選了張圖,并進(jìn)行圖片尺寸處理。
UIImage * image = [UIImage imageNamed:name];
UIImage * newImg = [self image:image byScalingToSize:self.bounds.size];
backgroundView.image = newImg;
backgroundView.clipsToBounds = YES;//切掉圖片多余的部分
//處理圖片方法
- (UIImage *)image:(UIImage*)image byScalingToSize:(CGSize)targetSize {
UIImage *sourceImage = image;
UIImage *newImage = nil;
UIGraphicsBeginImageContext(targetSize);
CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = CGPointZero;
thumbnailRect.size.width = targetSize.width;
thumbnailRect.size.height = targetSize.height;
?。踫ourceImage drawInRect:thumbnailRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage ;
}
3. 搞定了這些,準(zhǔn)備工作就完成了,接下來(lái),一個(gè)方法實(shí)現(xiàn)我們的下拉放大、上推縮小的功能,當(dāng)然,重點(diǎn)和難點(diǎn)是邏輯,技術(shù)很easy。大家都知道UITableView是繼承UIScrollView的,利用UIScrollView的代理方法- (void)scrollViewDidScroll:(UIScrollView *)scrollView;來(lái)實(shí)現(xiàn)。
下拉放大
在這個(gè)方法中,我們將功能分為兩部分,一個(gè)是下拉放大,這個(gè)是比較容易的,就是對(duì)頭部視圖的背景圖進(jìn)行放大,調(diào)整frame,需要注意的是在此需要調(diào)整圖片的顯示方式,因?yàn)橄吕蜕贤浦袌D片顯示的方式是不同的,否則即使你調(diào)整了frame,也不會(huì)按frame來(lái)顯示的。
_myView.backgroundView.contentMode = UIViewContentModeScaleToFill;
_myView.backgroundView.frame = CGRectMake(offset_Y*0.5 , -navHeight, VCWidth - offset_Y, headRect.size.height - offset_Y);
上推移動(dòng)縮小
這個(gè)就比較難理解了,當(dāng)然,我說(shuō)的是中間對(duì)frame的算法,我們將三個(gè)視圖分開(kāi)說(shuō)。
背景圖:先切換顯示模式,然后將y隨著tableview偏移移動(dòng)到0,高度也是隨著tableview偏移,最終移動(dòng)到需要的高度(Demo留的是44)
_myView.backgroundView.contentMode = UIViewContentModeTop;
_myView.backgroundView.frame = CGRectMake(0 ,navHeight* offset_Y/(headRect.size.height-navHeight-navHeight)-navHeight; , VCWidth , headRect.size.height -(navHeight + navHeight* offset_Y/(headRect.size.height-navHeight-navHeight)-navHeight;) - offset_Y);
頭像:頭像需要隨著tableview的偏移而移動(dòng)自身的位置,并且還要進(jìn)行縮小。這里面就是一個(gè)線性方程的關(guān)系,和上面的的背景圖是一樣的。
CGFloat width = offset_Y*(40-(VCWidth / 4))/(headRect.size.height-navHeight-navHeight)+(VCWidth / 4);
_myView.headView.frame =CGRectMake(0, 0, width,width);
_myView.headView.layer.cornerRadius =width*0.5;
_myView.headView.center = _myView.backgroundView.center;
簽名:簽名比較簡(jiǎn)單,只要跟著頭像動(dòng)就行,然后再根據(jù)偏移調(diào)整自己的透明度就行了。
_myView.signLabel.frame =CGRectMake(0, CGRectGetMaxY(_myView.headView.frame), VCWidth, 40);
_myView.signLabel.alpha = 1 - (offset_Y*3 / (headRect.size.height-navHeight-navHeight) /2);
然后就大功告成了。
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
iOS下拉放大上推縮小怎樣實(shí)現(xiàn)的下載
相關(guān)電子資料下載
- iOS17.1可能明天發(fā)布,iOS17.1主要修復(fù)哪些問(wèn)題? 377
- 華為全新鴻蒙蓄勢(shì)待發(fā) 僅支持鴻蒙內(nèi)核和鴻蒙系統(tǒng)應(yīng)用 719
- 蘋(píng)果手機(jī)系統(tǒng)iOS 17遭用戶質(zhì)疑 731
- iPhone12輻射超標(biāo)?蘋(píng)果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標(biāo)明年智能手機(jī)出貨7000萬(wàn)部;消息稱 MiOS 僅限國(guó)內(nèi),小米 28208
- 蘋(píng)果推送iOS17.0.3,解決iPhone15Pro系列存在機(jī)身過(guò)熱 216
- Testin云測(cè)兼容和真機(jī)服務(wù)平臺(tái)中上線iPhone 15系列手機(jī) 208
- 利爾達(dá)推出搭載HooRiiOS的Matter模組 145
- 運(yùn)放參數(shù)解析:輸入偏置電流(Ibias)和失調(diào)電流(Ios) 128
- 昆侖太科發(fā)布支持國(guó)產(chǎn)飛騰騰銳D2000芯片的開(kāi)源BIOS固件版本 448