2015-10-15 5 views
1

Я слышал, что viewDidLayoutSubviews - это лучшее место для изменения макета, когда мы использовали ограничения.Проблема при использовании viewDidLayoutSubviews

Так что я прыгнул viewDidLayoutSubviews

Я создал три UIViews и SubViewed их на SuperView. Я не упоминаю код для расчета фреймов.

[self.view addSubview:imgMiddleCircle]; 
[self.view addSubview:imgFirstCircle]; 
[self.view addSubview:imgLastCircle]; 

Используя этот кусок я добавляю эти круги.

Теперь, когда я запускаю мой код В viewDidLayoutSubviews я получаю следующие экраны:

enter image description here

И когда я переключаюсь на viewWillLayoutSubviews я получаю это на экране:

enter image description here

Почему я Я получаю дополнительные два круга в viewDidLayoutSubviews, даже создаю три круга.

И почему в viewWillLayout приведен правильный выход.

+1

'viewDidLayoutSubviews' вызывается несколько раз, поэтому вы видите дополнительные виды. Таким образом, это не идеальное место для добавления subviews. Как правило, вы добавляете subviews в 'viewDidLoad', и если вы действительно уверены, что хотите вручную вычислять фреймы, делайте это только в' viewDidLayoutSubviews' – Alladinian

+0

, вы имеете в виду внутреннее 'viewDidLayoutSubviews', называемое несколько раз .... И i не может использовать 'viewDidLoad', поскольку включен автозапуск. Я делаю вычисления на основе существующих элементов управления .. и в 'viewDidLoad'. Я не получаю правильный фрейм для существующих элементов управления. – Dalvik

+1

@RahulMishra установил фрейм в' viewDidLayoutSubviews' и добавил subviews в 'viewDidLoad' –

ответ

3

Вы должны указать, что viewDidLayoutSubviews называется несколькими типами.

В идеале addSubview: должно происходить в таком месте, как viewDidLoad, где вы уверены, что он называется только один раз.

Вы можете создать флаг, чтобы избежать вызова addSubview: типов кратные (не мой личный выбор)

В противном случае, попытайтесь переместить создать код viewDidLoad и заставить команду воспроизвести себя, прежде чем делать свой расчет:

[yourView setNeedsLayout];

[макет вашего изображенияIfNeeded];

2

Per Apple Documentation,

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

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

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

Посмотрите на это blog для получения более подробной информации.