如何以编程方式将子视图定位和调整为单元格的contentView

时间:2015-05-31 20:35:47

标签: objective-c uitableview layout

我想在frame处获取单元格tableView:cellForRowAtIndexPath:,以便定位和调整我要添加到UITableViewCell的{​​{1}}的视图的大小。但contentView总是self.frame

我知道你可以在(0, 0, 320, 44)中得到正确的frame(感谢this answer),但是如果我在那里添加子视图,那么每次重复使用单元格时都会这样做,而不是只有一次像Programmatically Adding Subviews to a Cell’s Content View中的“官方”示例一样。

在该示例中,他们使用硬编码帧添加一些视图,如:

layoutSubviews

我猜这个例子已经过时,因为他们应该使用约束,或者至少使用实际的单元格mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 220.0, 15.0)]; 来计算子视图的大小(这可能是不可能在那时获得的)。

注意:这让我想起了Android中使用的view holder设计模式。

2 个答案:

答案 0 :(得分:0)

这应该返回边界框架。

CGRect cellFrame = cell.bounds;

然后你可以像

一样使用它
cellFrame.size.width;
cellFrame.size.height;
cellFrame.origin.x;
cellFrame.origin.y;

等......虽然origin.x和origin.y应该都是0。

也许您应该在UITableViewCell子类中计算单元格高度并使用

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
在你的代表中找到正确的身高。

答案 1 :(得分:0)

我使用两种解决方案:

1)当我明确设置框架时

我假装框架:

#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)

// Use whatever height you like for your cell
// Should be the same value you return in tableView:heightForRowAtIndexPath:
CGFloat cellHeight = XXX;

CGRect frame = CGRectMake(0, 0, SCREEN_WIDTH, cellHeight);

2)当我使用autolayout

我只是将我的观点和约束添加到self.contentView

[someView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.contentView addSubview:someView];
[self.contentView addConstraints:someConstraints];

但请查看this answer以防万一。