首發(fā): http://www.reibang.com/p/42a84c9079c1
不知不覺(jué)就成了UITableView的重度患者庄新,應(yīng)對(duì)各種需求(比如換順序广恢、按條件顯示內(nèi)容、插廣告馋没、各處插廣告)真是舒心昔逗。
但是近來(lái)隨著使用漸多,某些情況也顯得捉襟見(jiàn)肘起來(lái):
問(wèn)題一:首先是老大難 auto layout
使用auto layout的過(guò)程中披泪,我始終覺(jué)得蘋(píng)果欠我們一個(gè)auto layout的初設(shè)函數(shù):要求其在view frame初始化后纤子,且view還未顯示時(shí)被調(diào)用;
先說(shuō)說(shuō)UIViewController
- 對(duì)UIViewController而言款票,比較推薦的auto layout的初設(shè)函數(shù)是
viewDidLoad
(見(jiàn)這個(gè)回復(fù):Where should I be setting autolayout constraints when creating views programatically)控硼。然而在viewDidLoad
中,view的frame并未得到初始化艾少,部分依賴(lài)于實(shí)際尺寸的constraint又該如何設(shè)置呢卡乾? - 還有一種做法是選用
viewDidLayoutSubviews
作為auto layout的初設(shè)函數(shù),這里滿(mǎn)足上面說(shuō)的兩個(gè)條件缚够,但是需要加上一個(gè)標(biāo)志位幔妨,用來(lái)判定是不是第一次(view還未顯示時(shí))調(diào)用鹦赎。丑爆了!
回到UITableViewCell
對(duì)于Cell而言,auto layout的初設(shè)函數(shù)應(yīng)該選用哪個(gè)误堡?比如下例:
cell上有一個(gè)view古话,要求在3.5寸屏上的大小為36x36,在4寸屏上的為50x50锁施,在4.7寸屏上為60x60陪踩,在5.5寸屏上位68x68(別問(wèn)為什么,就是這么任性)悉抵。這個(gè)constraint如何設(shè)置肩狂?
很多人會(huì)說(shuō)layoutSubviews
,然而:
- 同
viewDidLayoutSubviews
姥饰,要在layoutSubviews
中判斷是否為初次加載傻谁,需要額外參數(shù)一枚
- iOS9上,
layoutSubviews
有bug列粪,見(jiàn)我的帖子审磁,layoutSubviews
在cell加入view hierachy之前就被dequeueReusableCell......所調(diào)用了,簡(jiǎn)直不可原諒岂座。
問(wèn)題二:其次是逐漸增多的動(dòng)畫(huà)效果
動(dòng)畫(huà)的需求和上面提到的auto layout的初設(shè)函數(shù)有些類(lèi)似力图,同樣需要:
- 初始化后的frame
- 明確的timing:cell顯示在屏幕上以后
由于和問(wèn)題一類(lèi)似,就不展開(kāi)了掺逼。
解決問(wèn)題的思路
在思考如何解決上述問(wèn)題的過(guò)程中吃媒,特別是cell的layoutSubviews在iOS9上的問(wèn)題,使我不得不考慮尋求另外的函數(shù)入口吕喘。
自然而然赘那,我想到了UIViewController的生命周期函數(shù),暫時(shí)稱(chēng)之為Lifecycle events吧氯质。viewWillAppear, viewDidAppear, viewDidLayoutSubviews之類(lèi)的回調(diào)函數(shù)募舟,使我們可以從容的布置代碼。
為了實(shí)現(xiàn)這個(gè)目標(biāo)闻察,需要找到跟cell生命周期相關(guān)的各種函數(shù)拱礁,比如定義在UITableViewDelegate中的tableView:willDisplayCell:forIndexPath:
以及tableView:didEndDisplayCell:forIndexPath:
。在這兩個(gè)函數(shù)中觸發(fā)cellWillAppear
以及cellDidDisappear
辕漂,不能更贊呢灶!然而這兩個(gè)是optional delegate,并沒(méi)有具體的實(shí)現(xiàn)钉嘹,如何加以利用呢鸯乃?
解決問(wèn)題的方法
見(jiàn)下一篇:給TableViewCell加上生命周期事件(如cellWillAppear)(下)