UITableViewCell的高度在默許狀態下能表現的的東西很少,而且在復用的時候由于需要展現的信息不1定,所以需要動態的調理Cell的高度來滿足我們對不同內容的展現。在IOS8之前,這需要手動進行計算高度,比較麻煩。在參考許多人的博客文章后,根據IOS8的autolayout的特性,我做了1個自己的Tabelview自適應。雖然寫的不如github上看到的很多功能很強大,但也算完成了1點點基本的需求。在這進程中也對autoLayout有了1個更深的印象。
首先依照上1篇文章的方法建立1個TabelView。在這里我們還需要創建1個新的自定義TabelViewCell類,這樣能夠方便我們對Cell進行自定義
在自定義類中,要完成以下方法
- (void)layoutSubviews
{
[super layoutSubviews];
[self.contentView layoutIfNeeded];
self.sentence.preferredMaxLayoutWidth = CGRectGetWidth(self.sentence.frame);
}
這個方法將根據設置好的束縛進行布局調劑
接下來是在StroyBoard中進行1些設置。最關鍵的部份是對不同組件之間的束縛。束縛做的好不好將直接影響到最后的效果。
可以看到在這個原型Cell里面定義了3個組件。我們要做的就是將3個組件和ContentView依照1定束縛聯系起來。
在這里,我做的是將ImageView 和Label 進行上下束縛 ,button 和Label進行左右間距束縛,button和ImageView之間也進行上下束縛。
最后 將3者分別和ContenView進行束縛.
添加束縛的方法。在這里我曾嘗試通過Ctrl拖動進行束縛,但是出來的效果非常奇怪。在通過網上查詢后發現應當通過下圖的方法
在對每一個組件添加好束縛以后,在TabelViewController里面有1些必須要注意的
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didChangePreferredContentSize:)
name:UIContentSizeCategoryDidChangeNotification object:nil];
self.tableView.estimatedRowHeight = 100.0;
self.tableView.rowHeight = UITableViewAutomaticDimension;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIContentSizeCategoryDidChangeNotification object:nil];
}
- (void)didChangePreferredContentSize:(NSNotification *)notification
{
[self.tableView reloadData];
}
通過添加1個視察者,鐺鐺前的ContentSize要變化的時候,調用方法重新獲得數據。
同時,注意到我們設置了1個默許的高度
self.tableView.estimatedRowHeight = 100.0;
這個是預計估算1個Cell的高度,固然我們也能夠對不同類型的Cell設置不同的預設高度。
小結
對UITableViewCell的自定義是對UITableView自定義擴充的1個非常重要的點。在許多利用中都是靠擴充UITableView來展現信息。自適應高度的Cell更是非常重要。像微博,新聞等APP需要展現圖文的地方非常多,通過自定義Cell就可以快速的實現。在這里,對束縛的認識需要非常非常好。本身的代碼其實不是很多,關鍵是去理解束縛的概念。我在這里花了很多少時間參考了很多代碼。只有多寫多練才能更好的熟習。