【问题标题】:Constraint causing exception约束导致异常
【发布时间】:2026-01-11 15:30:01
【问题描述】:

我在UITableViewCell 子类的initWithStyle:reuseIdentifier: 方法中创建了这个约束:

[self.visualEffectView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[visualEffectView(50)]|" options:0 metrics:nil views:@{@"visualEffectView" : self.visualEffectView}]];

这应该限制UIVisualEffectView 占据屏幕的整个宽度,同时高度为 50 点并粘在单元格的底部。

但是,它显示正确但会导致此异常:

无法同时满足约束。

Will attempt to recover by breaking constraint <NSLayoutConstraint:0x15c7783b0 UIVisualEffectView:0x15c5ae220.top == CustomCell:0x15c5ac140'cell'.topMargin>

我在这里做错了什么?

更新

setup 是从initWithStyle:reuseIdentifier: 调用的

-(void)setup
{
    self.profileImageView = [UIImageView new];
    self.profileImageView.contentMode = UIViewContentModeScaleToFill;
    self.visualEffectView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]];

    [self addSubview:self.profileImageView];
    [self addSubview:self.visualEffectView];

    [self.profileImageView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.visualEffectView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[profileImageView]|" options:0 metrics:nil views:@{@"profileImageView" : self.profileImageView}]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[profileImageView]|" options:0 metrics:nil views:@{@"profileImageView" : self.profileImageView}]];

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[visualEffectView]|" options:0 metrics:nil views:@{@"visualEffectView" : self.visualEffectView}]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[visualEffectView(50)]|" options:0 metrics:nil views:@{@"visualEffectView" : self.visualEffectView}]];

}

完整的错误信息:

"(
"<NSLayoutConstraint:0x12c5b2c40 UIVisualEffectView:0x12c753b90.top == CustomCell:0x12c751bb0'cell'.topMargin>",
"<NSLayoutConstraint:0x12c5b2ec0 V:[UIVisualEffectView:0x12c753b90(50)]>",
"<NSLayoutConstraint:0x12c5b2f10 V:[UIVisualEffectView:0x12c753b90]-(0)-|   (Names: '|':CustomCell:0x12c751bb0'cell' )>",
"<NSLayoutConstraint:0x12c5ba110 'UIView-Encapsulated-Layout-Height' V:[CustomCell:0x12c751bb0'cell'(250)]>"
)"

【问题讨论】:

  • 它与其他约束冲突。还请从控制台发布这些错误和整个错误。
  • 您希望VisualEffectView 在单元格中垂直居中?
  • @Jelly 不,我希望它固定在单元格底部,高度为 50

标签: ios uitableview autolayout constraints tableviewcell


【解决方案1】:

你有一个额外的约束。替换

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[visualEffectView(50)]|" 
options:0 metrics:nil views:@{@"visualEffectView" : self.visualEffectView}]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[visualEffectView(50)]-0-|" 
options:0 metrics:nil views:@{@"visualEffectView" : self.visualEffectView}]];

【讨论】:

  • 看起来您缺少超级视图字符 |,但将其替换为:@"V:|[visualEffectView(50)]-0-|" 删除了异常,但现在它被固定在顶部而不是底部
  • 不要在左侧使用|,它会增加额外的约束。
  • 现在工作了。 | 的事情很奇怪——我在读 here,上面写着“当使用视觉格式语言时,正在描述约束的视图的父视图由 | 字符表示。”跨度>
  • 编辑:我想我明白了。因此,您使用| 字符作为约束“连接”到边缘的位置?而且因为我们不与顶部“连接”,所以我们排除了| 符号?