为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

iOS
慕哥6287543 2019-11-05 15:29:08
我已经为此工作了大约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天的时间尝试了很多可能性。这就是剩下的。
查看完整描述

3 回答

?
慕雪6442864

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之外并不是一件很优雅的事情。


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


为此,您必须准备带有水平边距的特殊背景图像,并且必须自己布置单元格的子视图以容纳边距。相比之下,如果您只是调整整个单元格的宽度,则自动调整大小将为您完成所有工作。


查看完整回答
反对 回复 2019-11-05
?
守着星空守着你

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

    }

}


查看完整回答
反对 回复 2019-11-05
?
萧十郎

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];

}

每当设备旋转时都会调用该方法,因此单元将始终居中。


查看完整回答
反对 回复 2019-11-05
  • 3 回答
  • 0 关注
  • 572 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信