iOS之下拉放大座享,上推縮小乍构,一個(gè)方法搞定

最近加班加的比較多旨袒,再加上這個(gè)真的比較考驗(yàn)邏輯瓣铣,所以一段時(shí)間都沒(méi)寫(xiě)東西了炮叶。來(lái)說(shuō)說(shuō)這次的功能碗旅,網(wǎng)上有很多類(lèi)似的demo,但都是分開(kāi)實(shí)現(xiàn)的镜悉,我把這兩個(gè)功能放到了一起扛芽,并且沒(méi)有使用AutoLayout,沒(méi)有用KVO,沒(méi)有用storyboard/xib.除了邏輯有點(diǎn)繞(現(xiàn)在不是流行玩算法么,那就搞的難理解點(diǎn)吧。积瞒。川尖。),其他的還是簡(jiǎn)單易懂的,而且我將重點(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;
    
    [sourceImage 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);

然后就大功告成了,里的的邏輯挺麻煩的,但有初中的數(shù)學(xué)水平就夠了,因?yàn)槎贾皇呛?jiǎn)單的線性關(guān)系。最后是Demo,歡迎大家Star.

版權(quán)聲明:本文為 Crazy Steven 原創(chuàng)出品躬柬,歡迎轉(zhuǎn)載拜轨,轉(zhuǎn)載時(shí)請(qǐng)注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末允青,一起剝皮案震驚了整個(gè)濱河市橄碾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颠锉,老刑警劉巖法牲,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異琼掠,居然都是意外死亡拒垃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)瓷蛙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)悼瓮,“玉大人,你說(shuō)我怎么就攤上這事艰猬『岜ぃ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵姥宝,是天一觀的道長(zhǎng)翅萤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腊满,這世上最難降的妖魔是什么套么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮碳蛋,結(jié)果婚禮上胚泌,老公的妹妹穿的比我還像新娘。我一直安慰自己肃弟,他們只是感情好玷室,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著笤受,像睡著了一般穷缤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箩兽,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天津肛,我揣著相機(jī)與錄音,去河邊找鬼汗贫。 笑死身坐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的落包。 我是一名探鬼主播部蛇,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咐蝇!你這毒婦竟也來(lái)了涯鲁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤有序,失蹤者是張志新(化名)和其女友劉穎撮竿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體笔呀,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幢踏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了许师。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片房蝉。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖微渠,靈堂內(nèi)的尸體忽然破棺而出搭幻,到底是詐尸還是另有隱情,我是刑警寧澤逞盆,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布檀蹋,位于F島的核電站,受9級(jí)特大地震影響云芦,放射性物質(zhì)發(fā)生泄漏俯逾。R本人自食惡果不足惜贸桶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桌肴。 院中可真熱鬧皇筛,春花似錦、人聲如沸坠七。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)彪置。三九已至拄踪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拳魁,已是汗流浹背惶桐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留的猛,地道東北人耀盗。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像卦尊,于是被迫代替她去往敵國(guó)和親叛拷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容