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

Tom*_*men 107 iphone width uitableview ios

我已经为此工作了大约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;
}
Run Code Online (Sandbox Code Playgroud)

解决方案#2:让图像呈现细胞

此解决方案在此处描述:http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

我希望这些信息对您有所帮助.我花了大约2天时间尝试了很多可能性.这就是剩下的.

an0*_*an0 226

实现这一目标的更好,更简洁的-setFrame:方法是继承UITableViewCell并重写其方法,如下所示:

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

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

  1. 调整表视图宽度 -viewWillAppear:

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

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

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

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

  • @misterkoz - 提醒一句:在某些iOS控制(对的UIDatePicker定)内部使用UITableViewCells,如果你实现这个类别中的突破. (11认同)
  • 尝试在编辑模式下删除单元格时,此方法似乎在iOS8中不起作用.进入/退出编辑模式时会调用setFrame,以便单元格不断缩小.对此有何解决方案? (7认同)
  • @JohnBaum这可能有所帮助(至少在我的情况下它有效):http://stackoverflow.com/questions/25911484/ios-8-cell-resizing/25915791 (3认同)
  • 这是一个很好的和优雅的解决方案,我在一个类别:)它我也注意到更透明的对象,更多的CPU加载:) (2认同)
  • 这个解决方案真是天赐之物.如果有人想知道如何在swift中做同样的事情 - http://www.reddit.com/r/swift/comments/2fr849/uitableviewcell_with_custom_width_in_swift/ (2认同)

JuJ*_*oDi 14

要在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
    }
}
Run Code Online (Sandbox Code Playgroud)


inc*_*eMe 9

如果没有任何作用你可以试试这个

将单元格的背景颜色设置为清晰颜色,然后放置具有所需大小的单元格图像.如果要在该单元格上显示一些文本,请在图像上方放置一个标签.不要忘记将标签的背景颜色设置为清晰的颜色.


Gra*_*ham 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];
}
Run Code Online (Sandbox Code Playgroud)

只要设备旋转,就会调用该方法,因此单元格将始终居中.