В большинстве случаев вы должны поместить код пользовательского интерфейса в метод viewDidLayoutSubviews
, потому что это происходит после того, как AutoLayout отсортировал элементы и разместил их правильно на представлении. Например, некоторый код в viewDidLoad
не будет работать правильно, если вы использовали ограничения в Storyboard. ViewDidLoad
работает до AutoLayout
делает свою магию, поэтому все ваши высоты и ширины будут испорчены, если вы использовали эти значения в коде.
viewDidLayoutSubviews
запускается после AutoLayout, поэтому лучше всего разместить его там, если вы никогда не используете значения фрейма, на которые мог повлиять AutoLayout. Тем не менее, по-прежнему хорошая практика поместить его в viewDidLayoutSubviews
. Но так, как вы знаете, этот метод выполняется несколько раз при определенных действиях, например, просто нажав на UITextField
, он снова запустится. Это становится проблемой, потому что это плохо для производительности и может запускать ненужный код. Например, вы можете добавить специальную границу под текстовым полем. Для этого вы можете создать новый слой и добавить его в текстовое поле, используя высоту и ширину. Поскольку он использует свойства рамки, он не будет работать в viewDidLoad
, так как высота и ширина еще не были настроены с помощью AutoLayout. Это означает, что вам нужно будет поместить его в viewDidLayoutSubviews, где он будет продолжать получать вызовы после нажатия textField, по существу добавляя неограниченное количество границ.
Чтобы исправить эту проблему производительности, на самом деле лучше всего создать подкласс вашего элемента пользовательского интерфейса и настроить его в методе override drawRect
. Вы можете получить доступ ко всем свойствам объекта там, и легко настроить все, что вы хотите. Затем в инспекторе Identity Inspector измените класс элемента на ваш подкласс. Это позволит Xcode автоматически делать все только при создании элемента и после завершения AutoLayout, что делает его наилучшим способом настройки пользовательского интерфейса.
Наконец, существует еще один способ настройки элементов. В Identity Inspector, если вы перейдете к атрибутам Runtime User Defined Runtime, вы можете легко добавлять свойства и редактировать значения там. Просто добавьте ключевой путь (имя атрибута), затем укажите тип значения, который он есть, и добавьте его! Это легко сделать, но для некоторых более сложных атрибутов проще всего сделать это в коде.
См. Рисунок ниже, чтобы узнать, где вы можете указать подкласс и добавить атрибуты времени выполнения.
Customizing in Storyboard
Я бы поставил его в '' viewDidLoad. – Cesare
Но это разрушает шаблон дизайна MVC ... – Peter
Вы можете создавать свои собственные классы для элементов, которые вы хотите настроить, и настроить их в представлении. Например. вам нужно 'UIView' с закругленными углами, поэтому создайте' JanView' (дочерний элемент 'UIView') и установите закругленные углы в методе' init ... ' –