學(xué)習(xí)筆記-仿微博詳情頁面設(shè)計(jì)思路

前言:


時間軸如下:
1 .首先看一遍實(shí)現(xiàn)效果還有源碼,源碼這里下載:https://github.com/Ade0408/PersonDetailPage
2 .花一個早上的時間實(shí)現(xiàn)還有各個細(xì)節(jié)點(diǎn)分析
3 .差不多一個下午的時間寫總結(jié)
4.本文僅僅供個人學(xué)習(xí)記錄

效果如下:


demo.gif
  • 拖動效果:
    • 向上滑動時,HeadView會跟著向上滑動,并且滑動到選項(xiàng)卡的區(qū)域時,就不會再向上滑動
    • 向下滑動時,HeadView的高度會隨著拉動而變大,實(shí)現(xiàn)放大背景圖的效果

思路如下:


  • 1 . 搭建界面布局,設(shè)置好約束(注意 : HeadView 和 選項(xiàng)卡都是直接添加到主View上的,并不是在TableView上)
  • 2 . HeadView 背景圖注意點(diǎn):需要設(shè)置背景圖片的內(nèi)容模式為 UIViewContentModeScaleAspectFill(內(nèi)容填充) ,只有設(shè)置成這個才能隨著HeadView的變大而變大,但是還有需要注意的是,同時我們還需要設(shè)置把圖片多出來的部分給剪切掉,因?yàn)?UIViewContentModeScaleAspectFill(內(nèi)容填充) 是同比例變大,所以會有多出的部分,可以通過設(shè)置imageV的clipsToBounds 屬性為 YES
  • 3 . 設(shè)置一些常量屬性:
    • HeadView 高度
    • HeadView 最小高度 (當(dāng)?shù)扔谶@個最小高度時,狀態(tài)欄才會完全顯示出來)
    • 選項(xiàng)卡高度
    • 原始偏移量 : - (HeadView 高度 + 選項(xiàng)卡高度),注意:該常量是負(fù)的,該原始偏移量就是tableView的 contentOffset.y
  • 4 . 接下來可以開始寫代碼了,我們目前需要做4件事:
    • 4.1 把導(dǎo)航欄完全隱藏
    • 4.2 把導(dǎo)航欄上的文字隱藏
    • 4.3 把tableView的內(nèi)容下移244個單位(HeadView 高度+選項(xiàng)卡高度)
    • 4.4 讓底下的tableView不要自動滾動64個單位
- (void) setNavgationBarHide {
    
    /** 把tableview視圖整體往下移動244個單位,因?yàn)檫@一部分是頭部視圖還有選項(xiàng)卡的大小 */
    // kHeaderViewHeight 和 kChooseViewHeight 都是前面說到的常量,一個是200,一個是44
    self.contentTableView.contentInset = UIEdgeInsetsMake(kHeaderViewHeight+kChooseViewHeight,0, 0, 0);
    
    /** 不要自動往下滾動64個單位.(64是原本狀態(tài)欄還有導(dǎo)航欄的高度合) */
    self.automaticallyAdjustsScrollViewInsets = NO;

    /** 設(shè)置導(dǎo)航欄為透明,其原理就是傳入一個沒有圖片,但又不為空的UIImage給導(dǎo)航欄 */
    [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];

    /** 把導(dǎo)航欄上的分隔線用一個沒有圖片,但又不為空的UIImage給覆蓋掉 */
    [self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];
    
    /** 添加自定義title */
    UILabel *contentLable = [[UILabel alloc] init];
    contentLable.text = @"微博個人詳情頁面";
    /** 讓label根據(jù)文字的大小自己調(diào)整大小 */
    [contentLable sizeToFit];
    self.navigationItem.titleView = contentLable;
    
    /** 默認(rèn)隱藏title */
    contentLable.textColor = [UIColor colorWithWhite:0 alpha:0];
    
    /** 讓控制器的self.contentLabel指向contentLable,這樣方便我們后續(xù)對它進(jìn)行操作 */
    self.contentLabel = contentLable;
}
  • 5 . 這時你可以先給tableView設(shè)置一些假數(shù)據(jù),使它等會可以拖動到底部
  • 6 . 使用 UIScrollView 的代理方法 ( scrollViewDidScroll: ) 監(jiān)聽滾動事件
  • 7 . 這是最重要的一步,總體效果都在這里進(jìn)行實(shí)現(xiàn),雖然都是在 UIScrollView 代理方法里進(jìn)行實(shí)現(xiàn),但是還是分開來寫.這里我們需要把它拆分成幾個步驟來做:
    • 7.1 計(jì)算偏移量,這個偏移量的計(jì)算公式為:用戶滾動視圖的偏移量 - 原始偏移量,也就是如下公式:
微博詳情頁面offset計(jì)算思路.png
/** 計(jì)算偏移量,originalOffset也就是上面提到的原始偏移量,因?yàn)槲覀儼裻ableView往下移動了244個單位,所以這個原始偏移量就是這個值 */
  CGFloat offset = scrollView.contentOffset.y - originalOffset;
  • 7.2 計(jì)算偏移高度
// 偏移高度 = 默認(rèn)高度 - 偏移量
CGFloat offsetHeight = kHeaderViewHeight - offset;
  • 7.3 設(shè)置headView 的高度隨著下拉或上拉而變化 (注意點(diǎn) : HeadView的最小高度是64,我們在前面已經(jīng)設(shè)置過這個常量了,那么當(dāng)偏移高度小于這個值時,我們默認(rèn)設(shè)置為這個值,并且通過設(shè)置這個值,我們還可以實(shí)現(xiàn)選項(xiàng)卡懸停效果) :
/** 懸停效果,其實(shí)就是不讓圖片的高度繼續(xù)減小,最小只能是64 */
  if (offsetHeight < kHeaderViewMinHeight) {
      offsetHeight = kHeaderViewMinHeight;
  }
  
  /** 通過修改Height達(dá)到效果,當(dāng)向上滾動時,選項(xiàng)卡向上滾動的速度比頭部視圖的還要快一點(diǎn) */
  self.headViewHeightConstraint.constant = offsetHeight;

效果如圖:

微博詳情頁面實(shí)現(xiàn)懸停效果.png
  • 7.4 程序?qū)懙竭@里,其實(shí)大部分效果都實(shí)現(xiàn)了,但是還差一個導(dǎo)航欄和導(dǎo)航欄上的文字隨著向上拉動而逐漸顯示,實(shí)現(xiàn)代碼如下:
  // alpha 值計(jì)算 : 偏移量 / (headView默認(rèn)高度 - headView最小高度) ,當(dāng)大于1時,導(dǎo)航欄和contentLabel就會完全顯示
  CGFloat alpha = offset / (kHeaderViewHeight - kHeaderViewMinHeight);
  
  // 前面我們設(shè)置好的 contentLabel ,可以在這里去動態(tài)設(shè)置它的alpha值
  self.contentLabel.textColor = [UIColor colorWithWhite:0 alpha:alpha];
  
  // 這里直接使用袁崢的Category方法,返回一張通過傳入顏色,返回一張1*1的圖片,navigationBar會圖片拉伸填充到整個導(dǎo)航欄
  [self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithWhite:1 alpha:alpha]] forBarMetrics:UIBarMetricsDefault];

結(jié)語:


若大家在觀看本文的過程發(fā)現(xiàn)我有任何的理解錯誤,可以在本文下進(jìn)行評論,我會第一時間進(jìn)行修改,最后,謝謝您的閱讀!
我的源碼地址:https://github.com/Ade0408/PersonDetailPage

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匕坯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件比然,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兼砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來既棺,“玉大人讽挟,你說我怎么就攤上這事⊥杳幔” “怎么了耽梅?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胖烛。 經(jīng)常有香客問我眼姐,道長诅迷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任众旗,我火速辦了婚禮罢杉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贡歧。我一直安慰自己滩租,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布艘款。 她就那樣靜靜地躺著持际,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哗咆。 梳的紋絲不亂的頭發(fā)上蜘欲,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機(jī)與錄音晌柬,去河邊找鬼姥份。 笑死,一個胖子當(dāng)著我的面吹牛年碘,可吹牛的內(nèi)容都是我干的澈歉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼屿衅,長吁一口氣:“原來是場噩夢啊……” “哼埃难!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涤久,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涡尘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后响迂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體考抄,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年蔗彤,在試婚紗的時候發(fā)現(xiàn)自己被綠了川梅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡然遏,死狀恐怖贫途,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情待侵,我是刑警寧澤潮饱,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站诫给,受9級特大地震影響香拉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜中狂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一凫碌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胃榕,春花似錦盛险、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至楔壤,卻和暖如春鹤啡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹲嚣。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工递瑰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隙畜。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓抖部,卻偏偏與公主長得像,于是被迫代替她去往敵國和親议惰。 傳聞我的和親對象是個殘疾皇子慎颗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件言询、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,117評論 4 61
  • 嗯哼嗯哼蹦擦擦~~~ 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS 目錄 ...
    philiha閱讀 4,906評論 0 6
  • 翻開整個朋友圈俯萎,滿滿都是秀恩愛的言語。整個世界充滿愛戀的氣息倍试,而我的世界里除了回憶讯屈,一無所有。 記憶很美县习,能陪我到...
    Time羽朦閱讀 294評論 12 4