簡體   English   中英

UITableViewCell:無法同時滿足約束

[英]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希望你處理的內容負責,從而減少意外的空間。 由於您已經使用自動布局定義了單元格的布局,因此您已經在那里了。

這是怎么做的:

  1. 只需向內容視圖添加另一個布局約束,將其約束到所需的592點高度。

  2. 然后完全刪除tableView:estimatedHeightForRowAtIndexPathtableView:heightForRowAtIndexPath的委托方法。

  3. 然后在viewDidLoad設置tableView.estimatedRowHeight = 600 (或實際上的任何值)。

現在tableView將單元格設置為高度592,這是單元格本身通過自己的自動布局約束聲明的高度。

這里有很多方法可以做到這一點: https//github.com/algal/TableViewSpike

注意:自行調整大小的單元需要iOS 8.0或更高版本的部署目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM