我有一个 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
知道自己的 secret ……
解决此问题的方法可能不止一种,但我建议改用自调整大小的单元格。这样您就可以对 UITableView
的确切内容负责期待你处理,留下更少的惊喜空间。由于您已经使用自动布局定义了单元格的布局,因此您几乎已经完成了。
这是如何做到的:
tableView:estimatedHeightForRowAtIndexPath
的委托(delegate)方法和 tableView:heightForRowAtIndexPath
完全。 tableView.estimatedRowHeight = 600
(或任何值,实际上)在 viewDidLoad
. 现在 tableView 将单元格设置为高度 592,这是单元格本身通过自己的自动布局约束声明他们喜欢的高度。
这里有许多方法的一些示例:https://github.com/algal/TableViewSpike .
注意:自调整单元格需要 iOS 8.0 或更高版本的部署目标。
关于ios - UITableViewCell : unable to simultaneously satisfy constraints,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31191611/