如何以分组样式设置UITableView中单元格的宽度

时间:2010-03-29 15:14:19

标签: ios iphone uitableview width

我已经为此工作了大约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天时间尝试了很多可能性。这就是剩下的。

7 个答案:

答案 0 :(得分:225)

实现这一目标的更好,更清晰的方法是继承UITableViewCell并覆盖其-setFrame:方法,如下所示:

- (void)setFrame:(CGRect)frame {
    frame.origin.x += inset;
    frame.size.width -= 2 * inset;
    [super setFrame:frame];
}

为什么更好?因为其他两个更糟糕。

  1. -viewWillAppear:

    中调整表格视图宽度

    首先,这是不可靠的,超级视图或父视图控制器可以在调用-viewWillAppear:之后进一步调整表视图帧。当然,你可以为你的UITableView创建子类和覆盖-setFrame:,就像我在这里为UITableViewCells做的那样。但是,对UITableViewCells进行子类化是一种非常常见,轻松和Apple的方式。

    其次,如果您的UITableView具有backgroundView,则不希望将其backgroundView缩小到一起。在缩小UITableView宽度的同时保持backgroundView宽度并非易事,更不用说在超级视图之外扩展子视图并不是一件非常优雅的事情。

  2. 自定义单元格渲染以伪造更窄的宽度

    要做到这一点,您必须准备具有水平边距的特殊背景图像,并且您必须自己布置单元格的子视图以适应边距。 相比之下,如果您只是调整整个单元格的宽度,自动调整将为您完成所有工作。

答案 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;
}