2015-04-30 14 views
0

我有一個自定義tableview +自定義單元格,使用基於約束的自動佈局構建(全部以編程方式,無IB)。在每個單元格中都有(可能)多行標籤和其他文字。自動佈局的第一個計算很好 - 即UILabel根據其文本長度正確包裝。iOS:如何在其accessoryView更改時觸發tableViewCell的約束/自動佈局刷新?

但是,我選擇一個單元格(即從UITableViewCellAccessoryNone更改爲UITableViewCellAccessoryCheckmark)並且UILabel.text所需行數應該改變 - 但是保持不變,但我仍然有相同的佈局問題。

我想...

[myTableView reloadData]; 

[myTableView beginUpdate]; 
[myTableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
[myTableView endUpdates]; 

...在委託小區選擇,但必須用於更新單元的佈局沒有成功。

我想我需要告訴系統重新評估tableviewcell的約束(特別是重新評估爲UILabel的preferredMaxLayoutWidth。)但我不知道如何以正確的方式做到這一點。 (我用setNeedsUpdate嘗試了一些東西,但試用了錯誤式。)

在此先感謝您指引我朝着正確的方向!

+0

爲你提供首選最大版面寬度上約束更新多標籤 - (空)updatePreferredMaxLayoutWidth:(的UILabel *)標籤 { label.preferredMaxLayoutWidth = [label alignmentRectForFrame:label.frame] .size.width; } – Vizllx

回答

1

你必須通過以下方式專門重新評估preferredMaxLayoutWidth爲的UILabel: -

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 
    [self updatePreferredMaxLayoutWidth:self.lblText]; // you have to store a UIlabel temporarily on didselectaction of UITableView 
    [self.view layoutSubviews]; 
} 
+0

感謝您幫助我在這裏!只是爲了確保 - 我是否需要爲此分類UILabel還是上面的代碼屬於其他位置(viewcontroller,tableview,cell)? (順便說一句,在調用[self.contentView layoutIfNeeded]和[super updateConstraints]之前,我在my custom cell的updateConstraints方法中設置了myLabel.preferredMaxLayoutWidth ...) – McMini

+0

yeah mate你可以在[self.view layoutSubviews]和[super viewDidLayoutSubviews],如果您使用自定義類,則必須在自定義UITableViewCell類中提供的方法(void)viewDidLayoutSubviews,否則對於原型Cell,您可以將其放在ViewController類中,但必須獲取來自你的tableview的Selected Cell的UILabel。 – Vizllx

相關問題