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

Posted

技术标签:

【中文标题】如何以分组样式设置 UITableView 中单元格的宽度【英文标题】:How to set the width of a cell in a UITableView in grouped style 【发布时间】:2011-02-02 02:23:35 【问题描述】:

我已经为此工作了大约 2 天,所以我想与您分享我的经验。

问题是:是否可以让分组的 UITableView 中的单元格宽度变小?

答案是:不。

但是有两种方法可以解决这个问题。

解决方案 #1:更薄的桌子 可以改变tableView的frame,让table变小。这将导致 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 天的时间尝试了很多可能性。这就是剩下的。

【问题讨论】:

我认为这应该设置为只有第二行的问题(“问题是:...”),然后解决方案 #1 和解决方案 #2 作为两个单独的答案发布,其中之一被接受。然后,如果其他用户添加了他们自己的答案,并且其中一个最终变得更好,则可以稍后更改接受的答案。 【参考方案1】:

在 .h 文件中添加委托 'UITableViewDataSource'

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
 
    return size;

【讨论】:

他想设置宽度,而不是高度 哦哦。不便之处敬请见谅。 你误解了这个问题,你回答了高度,你知道它对我有用,因为我正在寻找高度而不是宽度......谢谢你的回答【参考方案2】:

如果没有任何效果,你可以试试这个

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

【讨论】:

【参考方案3】:

实现这一点的更好更简洁的方法是继承 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 的宽度并非易事,更不用说将子视图扩展到其父视图之外并不是一件非常优雅的事情。

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

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

【讨论】:

这是一个不错且优雅的解决方案,我是在一个类别中完成的 :) 我还要注意,对象越透明,cpu 负载就越多:) @misterkoz -- 提醒一句:一些 ios 控件(UIDatePicker 是明确的)在内部使用 UITableViewCells,如果你在一个类别中实现它就会中断。 当试图在编辑模式下删除单元格时,此方法在 iOS8 中似乎不起作用。 setFrame 在您进入/退出编辑模式时被调用,因此单元格不断缩小。有什么解决办法吗? @JohnBaum 这可能会有所帮助(至少在我的情况下它有效):***.com/questions/25911484/ios-8-cell-resizing/… 这个解决方案真是天赐之物。如果有人想知道如何在 swift 中做同样的事情 - reddit.com/r/swift/comments/2fr849/…【参考方案4】:

我发现接受的解决方案在轮换时不起作用。为了实现具有固定宽度和灵活边距的 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];

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

【讨论】:

【参考方案5】:

我在

- (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】:

要在不提供设置变量方法的 Swift 中执行此操作,您必须覆盖 frame 的设置器。最初发布(至少在我找到它的地方)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
    

【讨论】:

适用于 swift【参考方案7】:

屏幕旋转时调用一个方法: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);
    ];

【讨论】:

以上是关于如何以分组样式设置 UITableView 中单元格的宽度的主要内容,如果未能解决你的问题,请参考以下文章

删除按钮位于 UITableView 样式分组单元格背景之外

分组 UITableView 上的自定义背景图像

如何以编程方式将 UITableView 样式从普通转换为组 [重复]

NativeScript-Vue 中的分组 UITableView

删除分组 uitableview 中单元格前的空格

在哪里将 UITableview 样式设置为分组样式