我有UITableViewCell
我使用自动布局放入contentView
标签和其他内容。我添加了约束,其中一个是contentView
与UITableViewCell
具有相同的边界。
(在storyboard
上,为方便起见,我选择iphone 4-inch
作为simulated metrics
的尺寸。)
添加约束后,我调用layoutIfNeeded
,因为我需要获取单元格的大小。确实存在约束,因为我可以看到我的contentView
现在与UITableViewCell
的大小相同。问题是UITableViewCell
的大小还没有适应屏幕的大小(我猜它会在我的细胞很好的时候自动完成)。因此,当我使用4.7英寸的iphone时,我仍然只有4英寸的iphone尺寸。
有没有办法触发我的单元格的最终大小,就像有办法强制使用layoutIfNeed
进行布局?
答案 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)]];