3 回答
TA贡献1812条经验 获得超5个赞
一种更好,更干净的方法是将UITableViewCell子类化并覆盖其-setFrame:方法,如下所示:
- (void)setFrame:(CGRect)frame {
frame.origin.x += inset;
frame.size.width -= 2 * inset;
[super setFrame:frame];
}
为什么会更好?因为其他两个更糟。
在中调整表格视图宽度 -viewWillAppear:
首先,这是不可靠的,在-viewWillAppear:调用后,超级视图或父视图控制器可能会进一步调整表视图框架。当然,您可以-setFrame:为UITableView 子类化和重写,就像我在这里为UITableViewCells所做的一样。但是,对UITableViewCells进行子类化是一种非常普遍,轻便和Apple的方式。
其次,如果您的UITableView具有backgroundView,则不希望将backgroundView一起缩小。在缩小UITableView宽度的同时保持backgroundView宽度并不是一件容易的事,更不用说首先将子视图扩展到其Superview之外并不是一件很优雅的事情。
自定义单元格渲染以伪造更窄的宽度
为此,您必须准备带有水平边距的特殊背景图像,并且必须自己布置单元格的子视图以容纳边距。相比之下,如果您只是调整整个单元格的宽度,则自动调整大小将为您完成所有工作。
TA贡献1799条经验 获得超8个赞
要在不提供设置变量方法的Swift中进行此操作,您必须覆盖的setter frame。原帖(至少在我找到它)在这里
override var frame: CGRect {
get {
return super.frame
}
set (newFrame) {
let inset: CGFloat = 15
var frame = newFrame
frame.origin.x += inset
frame.size.width -= 2 * inset
super.frame = frame
}
}
TA贡献1815条经验 获得超13个赞
我发现接受的解决方案在旋转时不起作用。为了实现具有固定宽度和灵活边距的UITableViewCells,我将上述解决方案调整为以下内容:
- (void)setFrame:(CGRect)frame {
if (self.superview) {
float cellWidth = 500.0;
frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2;
frame.size.width = cellWidth;
}
[super setFrame:frame];
}
每当设备旋转时都会调用该方法,因此单元将始终居中。
- 3 回答
- 0 关注
- 572 浏览
添加回答
举报