Использование NSLayoutAnchor плохо?
Я обычно использую NSLayoutAnchor, но много раз мне советовали не использовать его. Есть ли какие-либо проблемы, такие как падение производительности, кроме более сложного / более длинного кода?
Мне сказали использовать:
let myView = UIView(frame: CGRect(x: 0, y: 20, width: view.frame.bounds.width, height: 100))
Вместо:
let myView = UIView()
myView.translatesAutoresizingMaskIntoConstraints = false
myView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
myView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
myView.heightAnchor.constraint(equalToConstant: 100).isActive = true
3 ответа
Прежде всего, я хочу подтвердить, что использование фрейма намного быстрее, чем автоматическое расположение (~10 раз, как я знаю). Вот почему другой сказал вам использовать рамку вместо автоматической разметки. В то время как у @RakeshaShastri был хороший ответ, чтобы объяснить, почему мы должны использовать автоматическую разметку, мой ответ будет говорить о том, когда вы должны использовать фрейм вместо автоматической разметки.
- При отображении нормального вида, такого как
UIView
,UIButton
,UILabel
... на контроллере представления вы можете использовать автоматическое расположение. Разница между использованием фрейма и автоматической разметкой тривиальна. - С
UICollectionViewCell
а такжеUITableViewCell
, вы должны использовать кадр. В этом случае существует большая разница в производительности между рамкой и автоматическим макетом.
Давайте посмотрим на тест ниже, чтобы сравнить их.
Изображение взято из htt ps://github.com/layoutBox/LayoutFrameworkBenchmark. Показывает производительность при компоновке 100 ячеек UICollectionView
Как видите, автоматическое расположение занимает гораздо больше времени, чем ручное расположение, а не автоматическое расположение (~15 раз). Разница будет влиять на то, насколько гладким будет представление вашей коллекции при прокрутке.
Особенно, когда ваша ячейка имеет сложную иерархию представлений, автоматическое размещение займет много времени, чтобы вычислить позиции базы подпредставлений ячейки по ограничениям с лишними вычислениями. Это может сделать представление коллекции или представление таблицы отставая при прокрутке. Использование фрейма здесь позволяет максимально сократить лишние вычисления и помочь нам сэкономить время для других задач.
Выводы:
Будьте осторожны при использовании автоматического макета на
UICollectionViewCell
,UITableViewCell
, Если во время прокрутки представление коллекции или таблицы не является плавным, возможно, автоматическая разметка является серьезной причиной.Используйте фрейм только тогда, когда у вас проблемы с автоматическим макетом. Производительность, полученная от использования кадра в обычном случае, тривиальна.
Недостаток использования фреймов заключается в том, что после их разметки вам необходимо вручную изменять их всякий раз, когда вам нужно их изменить относительно чего-либо. Например: изменение ориентации, анимация и т. д. Но если вы используете автоматическое расположение, вы будете определять положение вида относительно, что означает, что даже в случае изменения ориентации или анимации ваш вид изменит свой размер в соответствии с установленными ограничениями.
Что касается падения производительности, автоматическая разметка занимает больше времени (не так много) для расчета кадра представления, но это будет незначительным, и удобный способ затмевает влияние на производительность.
В конце сценарий использования для фреймов будет очень мал, учитывая тот факт, что большинству видов потребуется динамическое позиционирование, основанное на размере экрана, изменении ориентации и т. Д. А смешивание фреймов и автоматическое расположение никогда не является хорошей идеей.
Tl; dr - Autolayout> кадров.
Если вас беспокоит сложный / длинный код, попробуйте SnapKit. Это заставляет вас любить autolayout https://github.com/SnapKit/SnapKit
При этом, многие люди склонны думать AutoLayout VS Frame. Но на самом деле вы должны использовать оба. Используйте Frame, если ваша точка зрения не изменится и требует быстрого взаимодействия. Используйте AutoLayout, если вы хотите, чтобы ваш вид был масштабируемым и обрабатывал пейзаж / портрет.