代码之家  ›  专栏  ›  技术社区  ›  Phlippie Bosman

在UI生命周期的哪个阶段,分隔线作为子视图添加到UITableViewCells?

  •  0
  • Phlippie Bosman  · 技术社区  · 5 年前

    我有一个有点奇怪的UITableView子类:它有一个超出单元边界的子视图。在初始化期间添加此子视图:

    class MyCell: UITableViewCell {
       override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
          super.init(style: style, reuseIdentifier: reuseIdentifier)
          self.contentView.addSubview(self.subviewThatGoesOutOfBounds)
       }
       ...
    }
    

    现在,当我为呈现此单元格的表视图保留分隔线时,我注意到显示了此单元格的分隔线 结束 超出单元格边界的子视图。在视图层次结构检查器的帮助下,我可以看到分隔线是一个视图,并且它是在我的子视图前面呈现的。

    我想我可以解决这个问题,要么把子视图放在前面,要么在添加分隔符行后等待将其作为子视图添加。但在细胞生命周期的哪个阶段呢?

    2 回复  |  直到 5 年前
        1
  •  1
  •   GaétanZ    5 年前

    表格视图单元格在布局过程中设置其层次结构(作为表格视图)。您可以使用调试器轻松地发现它:

    class TableViewCell: UITableViewCell {
        override func layoutSubviews() {
            contentView.printHierarchy() // one UITableViewLabel
            super.layoutSubviews()
            contentView.printHierarchy() // one UITableViewCellSeparatorView
        }
    }
    

    在场景后面,单元格使用 UITableViewCellLayoutManager 它根据表视图单元格的样式定义要添加或删除的子视图。

    这种行为可能会改变。我建议删除本机分隔符(使用 separatorStyle = .none )并添加自己的分隔符子视图。这样,如果UITableViewCell发展,代码仍然可以正常工作。否则,如果不介意,请添加子视图或将其置于后面 super.layoutSubviews .

        2
  •  0
  •   Phlippie Bosman    5 年前

    此打印调试代码

    class MyCell: UITableViewCell {
       override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
          super.init(style: style, reuseIdentifier: reuseIdentifier)
          self.contentView.addSubview(self.subviewThatGoesOutOfBounds)
       }
    
       override func didMoveToSuperview() {
          super.didMoveToSuperview()
          print("At didMoveToSuperview: \(self.subviews)")
       }
    
       override func layoutSubviews() {
          super.layoutSubviews()
          print("At layoutSubviews: \(self.subviews)")
       }
    }
    

    给我这个输出:

    At didMoveToSuperview: [<UITableViewCellContentView: 0x7fd876e03b40; frame = (0 0; 320 44); gestureRecognizers = <NSArray: 0x600001893330>; layer = <CALayer: 0x6000016ce1c0>>]
    At layoutSubviews: [<UITableViewCellContentView: 0x7f83bf66f2e0; frame = (0 0; 351 71.6667); gestureRecognizers = <NSArray: 0x600003db77e0>; layer = <CALayer: 0x600003276160>>, <_UITableViewCellSeparatorView: 0x7f83bf66eec0; frame = (15 71.6667; 336 0.333333); layer = <CALayer: 0x60000327b9c0>>]
    

    指示分隔符行不在后面添加 didMoveToSuperview 但之后 layoutSubviews .

    所以,虽然我不确定是否是 最早 在这一点上我可以修改子视图的排列 布局子视图 把戏演得很好。我修改 布局子视图

    override func layoutSubviews() {
       super.layoutSubviews()
       self.bringSubviewToFront(self.contentView)
    }
    

    根据需要,我的内容现在在分隔符前面。