В какой момент в течение жизненного цикла пользовательского интерфейса добавляются разделительные линии как подпредставления для UITableViewCells? - PullRequest
0 голосов
/ 21 января 2019

У меня есть подкласс UITableView, что немного странно: у него есть подпредставление, которое выходит за пределы ячейки. Я добавляю это подпредставление во время init:

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

Теперь, когда я оставляю разделительные линии включенными для табличного представления, которое отображает эту ячейку, я заметил, что разделительная линия этой ячейки отображается над подпредставлением, где оно выходит за границы ячейки. С помощью инспектора иерархии представлений я вижу, что разделительная линия является представлением и что она отображается перед моим подпредставлением.

Я думаю, что я мог бы решить эту проблему, выдвинув подпредставление на передний план или ожидая добавления его в качестве подпредставления после добавления разделительной линии. Но в какой момент в течение жизненного цикла клетки это будет?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Ячейки табличного представления устанавливают его иерархию во время этапа макета (как табличное представление).Вы можете легко обнаружить его с помощью отладчика:

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

За сценой ячейки используют UITableViewCellLayoutManager , который определяет подпредставления для добавления или удаления в зависимости от стиля ячейки табличного представления.

Это поведение может измениться.Я бы предложил удалить собственные разделители (используя separatorStyle = .none) и добавить ваше собственное подпредставление разделителя.Таким образом, ваш код будет по-прежнему функционировать, если UITableViewCell будет развиваться.В противном случае, если вы не возражаете, добавьте свои подпредставления или перенесите их на передний план после super.layoutSubviews.

0 голосов
/ 21 января 2019

Этот код печати-отладки

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.

Итак, хотя я не уверен, является ли это самой ранней точкой, во время которой я мог бы изменить расположение подпредставления, кажется, что layoutSubviews делает трюк просто отлично. Я изменил layoutSubviews до

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

и мой контент теперь перед разделителями, по желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...