Использование NSLayoutAnchor плохо? - PullRequest
0 голосов
/ 11 сентября 2018

Я обычно использую 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 ]

0 голосов
/ 11 сентября 2018

Прежде всего, я хочу подтвердить, что с использованием фрейма намного быстрее, чем автоматическая разметка (~ 10 раз, насколько я знаю).Вот почему другой сказал вам использовать рамку вместо автоматической разметки.В то время как у @RakeshaShastri был хороший ответ, объясняющий, почему мы должны использовать автоматическую разметку, мой ответ будет говорить о том, когда следует использовать рамку вместо автоматической разметки.


  • При отображении обычного вида, например UIView, UIButton, UILabel ... на контроллере вида вы можете использовать автоматическую разметку.Разница между использованием фрейма и автоматической разметкой тривиальна.
  • С UICollectionViewCell и UITableViewCell вы должны использовать фрейм.В этом случае существует большая разница в производительности между фреймом и автоматическим макетом.

Давайте посмотрим на сравнительный тест ниже, чтобы сравнить их.

Снимок сделан с LayoutFrameworkBenchmark .Он показывает производительность при компоновке 100 ячеек UICollectionView

enter image description here

Как видно, автоматическое расположение занимает гораздо больше времени, чем ручное расположение, а не автоматическое расположение (~ 15раз).Разница будет влиять на то, насколько гладким будет ваше представление коллекции, когда оно прокручивается.

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


Выводы:

  • Будьте осторожны при использованииавтоматическое расположение на UICollectionViewCell, UITableViewCell.Если во время прокрутки представление коллекции или таблицы не является плавным, возможно, причиной этого является автоматическое расположение.

  • Используйте фрейм только в случае возникновения проблем с автоматическим размещением.Производительность, полученная от использования фрейма в обычном случае, тривиальна.

0 голосов
/ 11 сентября 2018

Если вас беспокоит сложный / длинный код, попробуйте SnapKit.Это заставляет вас любить autolayout https://github.com/SnapKit/SnapKit

Тем не менее, многие люди склонны думать, AutoLayout VS Frame.Но на самом деле вы должны использовать оба.Используйте Frame, если ваша точка зрения не изменится и требует быстрого взаимодействия.Используйте AutoLayout, если вы хотите, чтобы ваш вид был масштабируемым и обрабатывал пейзаж / портрет.

0 голосов
/ 11 сентября 2018

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

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

В конце сценарий использования фреймов будет очень мал, учитывая тот факт, что большинству видов потребуется динамическое позиционирование, основанное на размере экрана, изменении ориентации и т. Д. И смешивание фреймов и автоматическое расположение никогда не бываетхорошая идея.


Tl; dr - Autolayout> frames.

...