ios - UITableViewCell : unable to simultaneously satisfy constraints

标签 ios objective-c uitableview autolayout

我有一个 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 的确切内容负责期待你处理,留下更少的惊喜空间。由于您已经使用自动布局定义了单元格的布局,因此您几乎已经完成了。

这是如何做到的:

  • 只需向内容 View 添加另一个布局约束,将其限制为所需的 592 点高度。
  • 然后删除 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/

    相关文章:

    objective-c - UILabel带有标签,无法设置文本

    具有 2 个数据源/委托(delegate)的 iOS Tableview

    ios - PFQuery 与 UITableView 中的多个数组

    ios - 以编程方式触发时 UIRefreshControl 不刷新

    ios - b2Body 移动时更新 CC Sprite 位置?

    ios - iTunes Connect 内部测试页面损坏

    ios - 如何使自定义 MKAnnotation 可拖动

    iphone - 更改部分的 uiTableview 单元格样式

    ios - 带有 GPUImageBuffer 目标的 GPUImagePicture?

    ios - 将表格滚动到底部后用新数据更新 UITableView 的数据源