AutoSizingCells предпочитаемыйLayoutAttributesFitting Performance [WWDC 2018] - PullRequest
0 голосов
/ 11 июня 2018

Я использую UICollectionView с ячейками AutoSizing, который похож на UITableView.

Как уже упоминалось в предыдущих вопросах: q1 , q2 принятие Self-Для определения размеров ячеек требуется реализация метода preferredLayoutAttributesFitting(_:) для применения определения размеров с помощью systemLayoutSizeFitting(_ targetSize:).

Однако в недавнем сеансе WWDC ( High Performance Auto Layout ) было упомянутото, что использование systemLayoutSizeFitting(_ targetSize:) является дорогостоящим, поскольку создает новый механизм AutoLayout, который впоследствии отбрасывает его, требуя, чтобы он разрешил все ограничения, без кэширования ранее вычисленных результатов.

В моем приложении я реализовал автоматическое определение размеров вмода, предложенная в ответах.Тем не менее, производительность прокрутки ужасна в табличных списках (много строк небольшой высоты).

Очевидно, что вызов systemLayoutSizeFitting(_ targetSize:) в UICollectionViewCell просто для вычисления его размера является дорогостоящим и обременительным для ЦП.(поскольку и оценка размера, и фактическая разметка выполняются в главном потоке).

Каков рекомендуемый способ одновременного достижения следующих результатов

  1. Стойлопрокрутка без UICollectionView
  2. Сделать ширину ячеек фиксированной и равной UICollectionView Width minus margins?

Какова рекомендуемая стратегия, чтобы иметь как ячейки AutoSizing, так и высокую производительность прокрутки?

1 Ответ

0 голосов
/ 12 июня 2018

Исправлено добавлением ограничения ширины к базовому классу.Поскольку метод preferredLayoutAttributesFitting использовался только для обновления предпочтительной ширины.

Метод updateConstraints вызывается не каждый раз во время прокрутки коллекции, что предотвращает отток ограничения:

import UIKit
import SnapKit

class AutoSizingCellBase: UICollectionViewCell {
  override class var requiresConstraintBasedLayout: Bool {
    return true
  }

  private var widthConstraint: Constraint?

  override func updateConstraints() {
    if widthConstraint == nil {
      if let window = window {
        let width = window.bounds.width - 16
        contentView.snp.makeConstraints { (make) in
          widthConstraint = make.width.equalTo(width).constraint
        }
      }
    }
    super.updateConstraints()
  }
}

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

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