我已经为此工作了大约2天,所以我想我和你分享我的经验。
问题是:是否可以使分组的UITableView中的单元格宽度更小?
答案是:否。
但是有两种方法可以解决这个问题。
解决方案#1:更薄的表格 可以更改tableView的框架,以便表格更小。这将导致UITableView以减小的宽度渲染内部单元格。
对此的解决方案如下所示:
-(void)viewWillAppear:(BOOL)animated
{
CGFloat tableBorderLeft = 20;
CGFloat tableBorderRight = 20;
CGRect tableRect = self.view.frame;
tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin
tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
tableView.frame = tableRect;
}
解决方案#2:让图片呈现细胞
此处描述了此解决方案:http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
我希望这些信息对您有所帮助。我花了大约2天时间尝试了很多可能性。这就是剩下的。
答案 0 :(得分:225)
实现这一目标的更好,更清晰的方法是继承UITableViewCell并覆盖其-setFrame:
方法,如下所示:
- (void)setFrame:(CGRect)frame {
frame.origin.x += inset;
frame.size.width -= 2 * inset;
[super setFrame:frame];
}
为什么更好?因为其他两个更糟糕。
在-viewWillAppear:
首先,这是不可靠的,超级视图或父视图控制器可以在调用-viewWillAppear:
之后进一步调整表视图帧。当然,你可以为你的UITableView创建子类和覆盖-setFrame:
,就像我在这里为UITableViewCells做的那样。但是,对UITableViewCells进行子类化是一种非常常见,轻松和Apple的方式。
其次,如果您的UITableView具有backgroundView,则不希望将其backgroundView缩小到一起。在缩小UITableView宽度的同时保持backgroundView宽度并非易事,更不用说在超级视图之外扩展子视图并不是一件非常优雅的事情。
自定义单元格渲染以伪造更窄的宽度
要做到这一点,您必须准备具有水平边距的特殊背景图像,并且您必须自己布置单元格的子视图以适应边距。 相比之下,如果您只是调整整个单元格的宽度,自动调整将为您完成所有工作。
答案 1 :(得分:13)
要在Swift中执行此操作,它不提供设置变量的方法,您必须覆盖frame
的setter。最初发布(至少在我发现的地方)here
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
}
}
答案 2 :(得分:9)
如果无效,你可以试试这个
将单元格的背景颜色设置为清晰颜色,然后放置具有所需大小的单元格图像。如果要在该单元格上显示一些文本,请在图像上方放置一个标签。不要忘记将标签的背景颜色也设置为清晰的颜色。
答案 3 :(得分:8)
我发现接受的解决方案在轮换时不起作用。实现具有固定宽度的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];
}
只要设备旋转,就会调用该方法,因此单元格将始终居中。
答案 4 :(得分:0)
旋转屏幕时会调用一个方法:viewWillTransitionToSize
这是你应该调整框架大小的地方。见例子。根据需要更改框架坐标。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
int x = 0;
int y = 0;
self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height);
}];
}
答案 5 :(得分:-2)
我在
中这样做- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell;
CGFloat tableBorderLeft = self.view.frame.origin.x + 10;
CGFloat tableBorderRight = self.view.frame.size.width - 20;
CGRect tableRect = self.view.frame;
tableRect.origin.x = tableBorderLeft;
tableRect.size.width = tableBorderRight;
tableView.frame = tableRect;
}
这对我有用
答案 6 :(得分:-6)
在.h文件中添加委托'UITableViewDataSource'
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return size;
}