调整 UITableViewCell 大小的 NSLayoutConstraint 错误

Posted

技术标签:

【中文标题】调整 UITableViewCell 大小的 NSLayoutConstraint 错误【英文标题】:NSLayoutConstraint errors with resizing UITableViewCell 【发布时间】:2014-01-28 20:37:23 【问题描述】:

我有一个自定义 UITableViewCell,它带有一个使用自动布局调整大小的子视图。该子视图是单元格底部的工具栏。当单元格未被选中时,它的高度为零,并在选中状态下增长到 30。单元格在 100 和 130 之间切换。

这里是初始化:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) 
        _toolbarView = [[FOToolbarView alloc] init];
        _toolbarView.translatesAutoresizingMaskIntoConstraints = NO;
        _toolbarView.backgroundColor = [UIColor blueColor];
        [self.contentView addSubview: _toolbarView];

        [self setNeedsUpdateConstraints];
    
    return self;

这里有限制

- (void)updateConstraints

    [self.contentView addConstraint: [NSLayoutConstraint constraintWithItem: _toolbarView
                                                                  attribute: NSLayoutAttributeWidth
                                                                  relatedBy: NSLayoutRelationEqual
                                                                     toItem: self.contentView
                                                                  attribute: NSLayoutAttributeWidth
                                                                 multiplier: 1.0
                                                                   constant: 0]];
    [self.contentView addConstraint: [NSLayoutConstraint constraintWithItem: _toolbarView
                                                                  attribute: NSLayoutAttributeLeft
                                                                  relatedBy: NSLayoutRelationEqual
                                                                     toItem: self.contentView
                                                                  attribute: NSLayoutAttributeLeft
                                                                 multiplier: 1.0
                                                                   constant: 0]];
    [self.contentView addConstraint: [NSLayoutConstraint constraintWithItem: _toolbarView
                                                                  attribute: NSLayoutAttributeTop
                                                                  relatedBy: NSLayoutRelationEqual
                                                                     toItem: self.contentView
                                                                  attribute: NSLayoutAttributeTop
                                                                 multiplier: 0.0
                                                                   constant: 100.0]];
    [self.contentView addConstraint: [NSLayoutConstraint constraintWithItem: _toolbarView
                                                                  attribute: NSLayoutAttributeBottom
                                                                  relatedBy: NSLayoutRelationEqual
                                                                     toItem: self.contentView
                                                                  attribute: NSLayoutAttributeBottom
                                                                 multiplier: 1.0
                                                                   constant: 0]];
    [super updateConstraints];

布局按预期工作,但出现以下错误:

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x1f810f50 FOToolbarView:0x1f812900.top == + 70>",
    "<NSLayoutConstraint:0x1f810dc0 FOToolbarView:0x1f812900.bottom == UITableViewCellContentView:0x1f8286d0.bottom>",
    "<NSAutoresizingMaskLayoutConstraint:0x1f821230 h=--& v=--& V: [UITableViewCellContentView:0x1f8286d0(69)]>"
)

我尝试了很多东西,但都没有成功。我怎样才能摆脱这个错误?

【问题讨论】:

【参考方案1】:

问题似乎是系统自动添加了来自 tableviewcell.contentview 的 autoresizingmask 约束。试试这个:

self.contentView.translatesAutoresizingMaskIntoConstraints = NO;

【讨论】:

这行得通。然后我只需要在 updateConstraints 中为 contentView 添加约束,这样它就会随着单元格展开。

以上是关于调整 UITableViewCell 大小的 NSLayoutConstraint 错误的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 根据屏幕大小调整大小

调整 UITableViewCell 大小的 NSLayoutConstraint 错误

根据内容可用性调整 UITableViewCell 的大小作为响应

iOS - UITableViewCell 图像调整/调整大小

如何让 UITableView 行高自动调整为 UITableViewCell 的大小?

横向调整内容 UITableviewcell 的大小