[英]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.