使用自动布局时如何知道UITableViewCell的宽度?

时间:2015-07-07 09:19:21

标签: ios swift uitableview autolayout

我有UITableViewCell我使用自动布局放入contentView标签和其他内容。我添加了约束,其中一个是contentViewUITableViewCell具有相同的边界。

(在storyboard上,为方便起见,我选择iphone 4-inch作为simulated metrics的尺寸。)

添加约束后,我调用layoutIfNeeded,因为我需要获取单元格的大小。确实存在约束,因为我可以看到我的contentView现在与UITableViewCell的大小相同。问题是UITableViewCell的大小还没有适应屏幕的大小(我猜它会在我的细胞很好的时候自动完成)。因此,当我使用4.7英寸的iphone时,我仍然只有4英寸的iphone尺寸。

有没有办法触发我的单元格的最终大小,就像有办法强制使用layoutIfNeed进行布局?

2 个答案:

答案 0 :(得分:7)

从storyboard或nib加载单元格时,它在nib中具有指定的大小而不是最终的大小。在cellForRowAtIndexPath中将您的观看次数和约束添加到contentView,然后调整宽度cell.width = tableView.width。最后,像以前一样打电话给layoutIfNeeded

这将导致具有正确宽度的单元格的完整布局。

编辑:这是有效的,因为即使您正在加载启用了autolayout(translatesAutoresizingMasksIntoConstraints = NO)的笔尖,每个nib文件的第一个视图也始终禁用自动布局(translatesAutoresizingMasksIntoConstraints = YES)。

这意味着在渲染视图时(这样做layoutIfNeeded),autolayout会考虑实际的frame和mask属性来确定正确的大小。

答案 1 :(得分:3)

添加约束后,您不需要调用layoutIfNeeded。

您可以对单元格进行子类化并覆盖 - (void)layoutSubviews 方法以获取帧更改,或者如果您不想将其子类化,则可以向该单元格添加观察者。

[cell addObserver:yourObserver forKeyPath:@"self.frame" options:NSKeyValueObservingOptionNew context:NULL];

然后,在观察者的班级

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if(object==cell && [keyPath isEqualToString:@"self.frame"]) {
        //your code...
    }
}

如果它不起作用,请尝试用cell.contentView替换cell。

编辑:如果要使用与单元格高度匹配且宽度为100且与单元格保持对齐的约束来创建子视图。

UIView *createdSubview = [[UIView alloc] init];
createdSubview.translatesAutoresizingMaskIntoConstraints = NO;
[cell.contentView addSubview:createdSubview];

//Left align
[cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[createdSubview]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(createdSubview)]];

// Fit the parent view height
[cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[createdSubview]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(createdSubview)]];

// Width constraint
[cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[createdSubview(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(createdSubview)]];