[英]UITableViewCell: unable to simultaneously satisfy constraints
我有一個我正在創建的UITableViewCell
,我正在使用自動布局,其中約束完全由代碼構成。
雖然應用程序中的實際輸出很好(即,它看起來就像我設計的那樣),但我得到着名的“無法同時滿足約束”錯誤/警告消息。
以下是錯誤消息打印的約束列表:
"<NSLayoutConstraint:0x7fb2f280e5e0 V:|-(0)-[UIScrollView:0x7fb2f0435730] (Names: '|':UITableViewCellContentView:0x7fb2f04345c0 )>",
"<NSLayoutConstraint:0x7fb2f280e880 V:[UIScrollView:0x7fb2f0435730(280)]>",
"<NSLayoutConstraint:0x7fb2f280e630 V:[UIScrollView:0x7fb2f0435730]-(16)-[UIScrollView:0x7fb2f04360d0]>",
"<NSLayoutConstraint:0x7fb2f280e920 V:[UIScrollView:0x7fb2f04360d0(140)]>",
"<NSLayoutConstraint:0x7fb2f280e970 V:[UIScrollView:0x7fb2f04360d0]-(16)-[SummaryView:0x7fb2f0436c20]>",
"<NSLayoutConstraint:0x7fb2f280e9f0 V:[SummaryView:0x7fb2f0436c20(140)]>",
"<NSLayoutConstraint:0x7fb2f280e8d0 V:[SummaryView:0x7fb2f0436c20]-(0)-| (Names: '|':UITableViewCellContentView:0x7fb2f04345c0 )>",
"<NSLayoutConstraint:0x7fb2f0439e30 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fb2f04345c0(44)]>"
它們中的每一個都是完全正確的,正是我想要的,除了最后一個。 系統生成的很明顯。 44分是(我相信)系統標准的單元格高度。 對我來說很好奇的是我明確說明了正確的細胞高度(在這種情況下,592個點)。 這是我在UITableViewController
子類中所做的:
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [TableViewCell heightNeededForCell];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [TableViewCell heightNeededForCell];
}
我認為發生這種情況的原因是因為我的單元格的init
函數:
#pragma mark - Table View Cell Lifecycle
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self != nil) {
[self setupUserInterface];
}
return self;
}
#pragma mark - UI Setup
- (void)setupUserInterface {
[self createControls];
[self createConstants];
[self setupControls];
[self layoutControls];
[self.contentView layoutIfNeeded]; <-- Here's where the warning occurs
// The UIScrollViews (which contain UIImageViews) were not
// adjusting their contentSize properly, so I do it manually here
self.scrollView1.contentSize = self.heartImageView1.bounds.size;
self.scrollView2.contentSize = self.heartImageView2.bounds.size;
}
}
根據我的結果,似乎我可以放心地忽略這個錯誤,但我有點挑剔而且不喜歡我收到警告的事實,即使我能解釋它並且它似乎沒有引起任何麻煩。 如何成功更改系統提供的約束?
你是對的,意外的約束來自UITableView
機器本身。
我認為當您在初始化程序中調用layoutIfNeeded
時,您會混淆UITableView
機器,它希望負責在整個單元格上進行布局,並確保單元格正確包裝其自己的contentView
。 所以你已經告訴contentView
布局,但是單元格本身並沒有被告知在正確的時間串聯布局。 什么是合適的時間? 只有UITableView
知道它自己的秘密......
可能有不止一種方法來解決這個問題,但我建議切換到使用自調整單元格。 這樣你就可以對UITableView
希望你處理的內容負責,從而減少意外的空間。 由於您已經使用自動布局定義了單元格的布局,因此您已經在那里了。
這是怎么做的:
只需向內容視圖添加另一個布局約束,將其約束到所需的592點高度。
然后完全刪除tableView:estimatedHeightForRowAtIndexPath
和tableView:heightForRowAtIndexPath
的委托方法。
然后在viewDidLoad
設置tableView.estimatedRowHeight = 600
(或實際上的任何值)。
現在tableView將單元格設置為高度592,這是單元格本身通過自己的自動布局約束聲明的高度。
這里有很多方法可以做到這一點: https : //github.com/algal/TableViewSpike 。
注意:自行調整大小的單元需要iOS 8.0或更高版本的部署目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.