更改 tableviewcell 的宽度 swift

change width of tableviewcell swift

我有一个使用带有自定义单元格和原型单元格的 IB 的 tableView。

我正在尝试使单元格的宽度比 tableView.frame 稍短,以便在左右角之间留出一点 space。

var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as TableViewCell
        cell.bounds = CGRectMake(10, self.tableView.frame.origin.y, 30, self.tableView.frame.size.height)
        cell.layer.bounds = CGRectMake(10, self.tableView.frame.origin.y, 30, self.tableView.frame.size.height)
        cell.textLabel?.bounds = CGRectMake(10, self.tableView.frame.origin.y, 30, self.tableView.frame.size.height)

更新: 这是一个很好的例子,解释了如何将子视图添加到您的 tableView。 http://natashatherobot.com/ios-frame-vs-bounds-resize-basic-uitableview-cell/

更新 2: 看起来没有简单的方法可以做到这一点。据我所知,有 3 种方法可以实现这一点:

  1. 向您的单元格添加一个圆角的、较短的图像,使其具有完全相同的颜色并与您的背景相匹配。
  2. 您可以子类化 tableViewCell,然后使用 layoutSubviews,这样您可以在绘制单元格之前缩短它。我已经做到了,但是滚动性能很糟糕。
  3. 最好的方法是完全放弃 tableView 并用 collectionView 重新做。

table视图中的单元格应该与其容器一样宽。

如果您需要您的单元格具有与 table 视图不同的宽度,我建议将视图作为子视图添加到 cell.contentView 并使该视图尽可能宽,同时确保contentView 具有清晰的背景并且没有分隔符和所有内容(因此它看起来不存在)。

另一种解决方案是通过向其添加 left/right 填充,使 tableView 不像 superview 那样宽。但是你会遇到这样的问题,即在填充所在的左侧和右侧,你将无法滚动 tableView

我认为最干净的解决方案是使用 collectionView。它与 tableView 没有太大区别,您可以配置单元格的整个大小,而不仅仅是高度。

希望这可以帮助您解决问题。如果您需要更多帮助,请告诉我。

Swift 3:

对于仍在寻找好的解决方案的人来说,有一种比使用 layoutSubviews 或使用 collectionView 重做整个事情更简单、更有效的替代方法。

如果您已经对 tableViewCell 进行了子class编辑,那么在您的 TableViewController class 中您可以添加它以在 [=] 的每一侧添加纯白色边框28=] 查看单元格。

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

          // make sure in storyboard that your cell has the identifier "cell" and that your cell is subclassed in "TableViewCell.swift"
          let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! TableViewCell

          // the following code increases cell border on all sides of the cell
          cell.layer.borderWidth = 15.0
          cell.layer.borderColor = UIColor.white.cgColor

          return cell;

}

如果你想给单元格的每一边添加不同大小的边框,你也可以这样做:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

          let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! TableViewCell


        // the following code increases cell border only on specified borders
        let bottom_border = CALayer()
        let bottom_padding = CGFloat(10.0)
        bottom_border.borderColor = UIColor.white.cgColor
        bottom_border.frame = CGRect(x: 0, y: cell.frame.size.height - bottom_padding, width:  cell.frame.size.width, height: cell.frame.size.height)
        bottom_border.borderWidth = bottom_padding

        let right_border = CALayer()
        let right_padding = CGFloat(15.0)
        right_border.borderColor = UIColor.white.cgColor
        right_border.frame = CGRect(x: cell.frame.size.width - right_padding, y: 0, width: right_padding, height: cell.frame.size.height)
        right_border.borderWidth = right_padding

        let left_border = CALayer()
        let left_padding = CGFloat(15.0)
        left_border.borderColor = UIColor.white.cgColor
        left_border.frame = CGRect(x: 0, y: 0, width: left_padding, height: cell.frame.size.height)
        left_border.borderWidth = left_padding

        let top_border = CALayer()
        let top_padding = CGFloat(10.0)
        top_border.borderColor = UIColor.white.cgColor
        top_border.frame = CGRect(x: 0, y: 0, width: cell.frame.size.width, height: top_padding)
        top_border.borderWidth = top_padding


        cell.layer.addSublayer(bottom_border)
        cell.layer.addSublayer(right_border)
        cell.layer.addSublayer(left_border)
        cell.layer.addSublayer(top_border)


        return cell;

}

希望这对您有所帮助。

我找到了其他答案 unhelpful/incorrect,但在此处的其中一个答案中找到了我需要的内容:

How to set the width of a cell in a UITableView in grouped style

关键是,如果您有自定义单元格(OP 有,大多数应用程序都会有),那么您可以将 setFrame 方法重写为您需要的任何宽度。无需重新设计您的应用或做任何棘手的事情。