亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

有了AutoLayout,為什么你還是害怕寫UITabelView的自適應布局?

2019-11-14 18:16:03
字體:
來源:轉載
供稿:網友

Apple 算是最重視應用開發體驗的公司了.從Xib到StoryBoard,從Auto Layout到Size Class,每一次的更新,都會給iOS應用的開發帶來不小的便利.但是,對于絕對多數iOS攻城獅來說,我們依然還是很害怕寫UITabelVIew的自適應布局.當然,害怕不是因為我們不會寫,或者本身有什么特殊的技術點,而是因為太麻煩.當然,文章的后半部分,會給出相應的解決方案,畢竟本文不是為了吐槽而吐槽.

UITabelView的自適應布局有多麻煩?

數據類型的不確定性:種類越多,頁面越復雜.

網易新聞

以網易新聞的客戶端為例,可能的數據包括文字新聞,圖片新聞,圖集,推廣,視頻等.每一種數據,又根據來源或點擊量等細分出許多不同的狀態.基本上每種數據類型,都至少需要一種單獨的Cell去呈現,每一個Cell的布局,都要單獨去寫.所以說,數據的類型將直接決定頁面本身的復雜度.

數據長度的不確定性: 不確定字段越多,迭代成本越高.

新浪微博

上圖取自新浪微博.稍微有點經驗的iOS攻城獅,都猜到我要吐槽什么了吧!沒錯,就是同種數據類型,但是內部字段的長度可能不同,而且還要都要給他們顯示出來!其實我也很希望自家的應用都像網易那樣,固定長度顯示新聞,顯示不完,就直接截斷--可惜那樣的應用都是別人公司的應用.可能你會說: 頂部給個非微博正文區域給個固定高度;文字區域動態計算出高度;圖片部分,圖片高度固定,根據數量動態計算高度;轉發部分同理;然后根據數據在tabelView的代理方法 tableView:heightForRowAtIndexPath: 中動態返回高度即可.是的,思路就是這么個思路,但是你確定產品經理一直不會改需求?你確定不需要適配 6plus時,字號要大點?你確定自己的應用不希望大屏上一樣能顯示更多的圖片?你確定老板不是盤算著 ipad版也交給你維護?所以說,對于這種數據長度不確定,但是又要求完全顯示的設計,最復雜的不在于實現,而在于后期的迭代.可變字段越多,迭代越復雜.如果連顯示方式都改了,那就基本等于重做了幾遍.

cell高度計算有坑: 難以理解的詭異問題

tableView:heightForRowAtIndexPath: 中計算高度時,是有坑的,對于剛接觸iOS的攻城獅來說,幾乎是難以理解的詭異問題.這里簡單說兩個,其他的大家可跟帖補充:

1.文字高度計算時 0.1 高度誤差問題.

cell中經常需要使用 textRectForBounds: limitedToNumberOfLines: 來計算某一個文字的顯示高度.這里,其實有一個很大的坑的,如果你沒遇到只能說明你很幸運.由于浮點數四舍五入機制的存在,所以偶現UILabel最后一行無法顯示的情況.原因也很詭異: 在你計算時,部分值會存在稍許的不超過0.01的誤差,大多數情況下,這個誤差值,可以安全忽略,但是確實存在那0.01誤差剛好是絕對換行與不換行的分界值,因為0.01的誤差,可能計算出來的高度就不足以顯示最后幾個文字.為了安全起見,如果需要計算文本高度,我都是加上一個額外的0.1來保證最后一行肯定可以顯示.

2.手動調用 tableView:cellForRowAtIndexPath: 獲取cell,引起的卡頓問題.

這個可能也是一些有經驗的開發者也會混淆的問題: 不要在自己的代碼中調用 tableView:cellForRowAtIndexPath: 方法來獲取某一個位置的 cell,來進行關于這個cell的某些計算,因為你手動調用這個方法產生的cell不會參與cell的復用! 各種緣由,不過多解釋,總之結論就是,只要系統自己調用 tableView:cellForRowAtIndexPath: 方法產生的 cell才會參與cell的復用.
關于這個話題,比較易犯的錯誤是,竟然有開發者在

tableView:heightForRowAtIndexPath: 中調用 tableView:cellForRowAtIndexPath: 來獲取cell,然后計算cell高度.然后你會發現,凡是稍微涉及到圖片顯示的界面,你的顯示是對的,但是滾動非??D,因為你在自己渾然不覺的情況下創建了N個Cell,而且這些Cell絕對不會參與復用.

為什么我現在不再害怕寫UITabelView的自適應布局?

是的,我現在一點也不擔心去處理各種UITabelView布局.不是因為我有一股所謂的不畏艱難的偉大工作精神,而是因為我切實找到了解決辦法.具體該怎么做呢?

1.使用AutoLayout 布局你的cell

坦白說,咱都是剛入行的人,使用AutoLayout布局,寫一個自適應的Cell,大家估計也都會.可以用xib,也可以用純代碼寫.如果準備用純代碼寫,建議你先好好研究下 Masonry — 使用純代碼進行iOS應用的autolayout自適應布局

2.使用 UITableView-FDTemplateLayoutCell 根據單元格內容的約束自適應單元格高度

博客討論

坦白說,我原來也是: 雖然cell用著AutoLayout,但是計算cell高度時,也是看著設計圖返回一個適合的值--想想都虐心.前天,一個熱心的開發者在我博客留言說: 他用 Masonry 進行Cell的高度自適應時遇到了問題.我第一反應是: Masonry 能用來計算cell高度?! 然后,他提到了一個第三方UITableView-FDTemplateLayoutCell,好像是國內的大神寫的,具體介紹可以看這里: 優化UITableViewCell高度計算的那些事.這篇文章的博主關于 UITableView-FDTemplateLayoutCell 分析很詳盡,用一句總結就是: 一行代碼解決cell高度動態計算問題.

3.一個關于Masonry 和 UITableView-FDTemplateLayoutCell結合使用的小例子

一個關于Masonry 和 UITableView-FDTemplateLayoutCell結合使用的小例子

示例下載地址: 點擊下載

非常感謝 @未來帥哥 的討論,給了我很大啟發和幫助,我也如約做了一個關于Masonry 和 UITableView-FDTemplateLayoutCell結合使用的小例子,以解決他的問題:關于如何讓左側圖片底部總是不被遮蓋.

核心代碼片段:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{        CGFloat height = [tableView fd_heightForCellWithIdentifier: NSStringFromClass([YFAutoLayoutCell class]) cacheByIndexPath:indexPath configuration:^(YFAutoLayoutCell * cell) {        YFAutoLayoutCellModel * model = [self.data objectAtIndex: indexPath.row];                cell.model = model;    }];        return height;}
/** *  初始化視圖. */- (void) setupView{    self.imgView = [[UIImageView alloc] init];    self.introLabel = [[UILabel alloc] init];        [self.contentView addSubview: self.imgView];    [self.contentView addSubview: self.introLabel];        self.introLabel.numberOfLines = 0;        [self.imgView makeConstraints:^(MASConstraintMaker *make) {        make.top.left.equalTo(8);        make.size.equalTo(CGSizeMake(60, 60));        make.bottom.lessThanOrEqualTo(-8); // 這里是關鍵    }];        [self.introLabel makeConstraints:^(MASConstraintMaker *make) {        make.left.equalTo(self.imgView.right).offset(8);        make.top.equalTo(self.imgView);        make.right.equalTo(-8);        make.bottom.equalTo(-8);    }];}

小結

有了Auto Layout,為什么你還是害怕寫UITabelView的自適應布局?因為你還在用傳統的方式去計算cell的高度! Auto Layout + UITableView-FDTemplateLayoutCell + Masonry,耐心研究幾個小時,絕對讓你受益匪淺!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97国产在线观看| 日本不卡视频在线播放| 亚洲免费电影在线观看| 亚洲国产一区二区三区四区| 日韩av免费在线| 欧美成aaa人片免费看| 亚洲综合自拍一区| 久久精品视频中文字幕| 久久频这里精品99香蕉| 亚洲国产日韩欧美在线动漫| 欧美亚洲成人xxx| 91chinesevideo永久地址| 国产精品久久久久久中文字| 色噜噜亚洲精品中文字幕| 一区二区日韩精品| 欧美精品激情在线| 亚洲人精品午夜在线观看| 国产精品第3页| 91精品国产99久久久久久| 亚洲xxx视频| 日本不卡高字幕在线2019| 成人激情电影一区二区| 成人伊人精品色xxxx视频| 久久久久久久久久久91| 国产在线观看不卡| 日韩免费视频在线观看| 亚洲日韩中文字幕在线播放| 91青草视频久久| 羞羞色国产精品| 国产精品扒开腿爽爽爽视频| 日韩av在线免费播放| 这里只有精品在线播放| 欧美激情videoshd| 欧美黑人巨大xxx极品| 91中文字幕在线| 欧美孕妇毛茸茸xxxx| 狠狠爱在线视频一区| 国模精品系列视频| 国产精品com| 亚洲国产古装精品网站| 久久夜色精品国产亚洲aⅴ| 亚洲性生活视频在线观看| 亚洲成年人在线| 51视频国产精品一区二区| 国产精品99久久99久久久二8| 亚洲电影免费观看高清完整版在线| 久久九九免费视频| 亚洲视频在线观看视频| 夜夜嗨av一区二区三区免费区| 91av在线免费观看| 色多多国产成人永久免费网站| 日韩精品在线视频| 久久99久久99精品中文字幕| 国内精品久久久久影院优| 久久人人97超碰精品888| www.久久草.com| 日韩一区二区在线视频| 日本成熟性欧美| 国产va免费精品高清在线| 69久久夜色精品国产69乱青草| 亚洲一区久久久| 亚洲女同性videos| 亚洲人成电影网站色xx| 欧美大片va欧美在线播放| 亚洲精品视频二区| 精品女厕一区二区三区| 91产国在线观看动作片喷水| 亚洲精品国产综合区久久久久久久| 不卡在线观看电视剧完整版| 亚洲美女视频网站| 成人a视频在线观看| 在线视频精品一| 国产精品美女久久久久av超清| 久久人人爽国产| 久久激情视频久久| 91久久精品久久国产性色也91| 欧美日本啪啪无遮挡网站| 亚洲经典中文字幕| 亚洲欧洲在线看| 精品成人69xx.xyz| 韩日欧美一区二区| 97碰在线观看| 亚洲区在线播放| 神马久久久久久| 免费97视频在线精品国自产拍| 亚洲欧美日韩综合| www国产精品视频| 亚洲国产精彩中文乱码av在线播放| 国语自产精品视频在线看抢先版图片| 日韩电影免费在线观看| 最近2019中文字幕第三页视频| 亚洲激情小视频| 亚洲va欧美va国产综合久久| 日韩中文av在线| 亚洲爱爱爱爱爱| 亚洲一区二区久久久| 欧美日韩精品在线| 亚洲欧洲在线观看| 最近中文字幕日韩精品| 色老头一区二区三区| 亚洲热线99精品视频| 精品美女久久久久久免费| 91在线中文字幕| 日韩hd视频在线观看| 亚洲自拍另类欧美丝袜| 91在线国产电影| 色无极影院亚洲| 在线视频欧美性高潮| 欧美性猛交xxxx乱大交极品| 亚洲第一精品夜夜躁人人躁| 国产精品视频公开费视频| www.日韩免费| 韩国v欧美v日本v亚洲| 欧美与黑人午夜性猛交久久久| 91在线|亚洲| 秋霞成人午夜鲁丝一区二区三区| www.亚洲免费视频| 亚洲精品综合精品自拍| 日本精品性网站在线观看| 91在线高清视频| 久久久久久午夜| 日韩的一区二区| 色综久久综合桃花网| 色99之美女主播在线视频| 国产精品视频xxxx| 中文字幕av一区中文字幕天堂| 国产精品一区二区在线| 中文国产成人精品久久一| 欧美一级在线播放| 欧美日韩激情美女| 欧美巨大黑人极品精男| 欧美亚洲另类视频| 日韩电影免费观看中文字幕| 国产亚洲精品日韩| 中文字幕精品久久久久| 18性欧美xxxⅹ性满足| 4444欧美成人kkkk| 亚洲精品自拍视频| 久久精品国产精品亚洲| 欧美日韩成人在线播放| 精品美女国产在线| 色视频www在线播放国产成人| 91欧美激情另类亚洲| 爽爽爽爽爽爽爽成人免费观看| 日本国产欧美一区二区三区| 全色精品综合影院| 欧美日韩亚洲网| 成人黄色片网站| 精品国产一区二区三区久久久| 国产视频欧美视频| 日韩欧美国产成人| 亚洲一区二区三区成人在线视频精品| 激情亚洲一区二区三区四区| 欧美一级淫片aaaaaaa视频| 亚洲午夜未删减在线观看| 97超碰蝌蚪网人人做人人爽| 精品视频在线播放| 7777精品久久久久久| 国产精品第1页| 日韩在线精品视频| 亚洲精品自产拍| 国产免费一区二区三区在线能观看| 97成人精品视频在线观看| 久久亚洲精品视频|