При программном создании макетов я следую рекомендациям Apple: переопределять -updateConstraints, добавлять пользовательские ограничения и вызывать -setNeedsUpdateConstraints после того, как в представлении добавлены субвью. Моя типичная настройка выглядит так:
- (void)setupViews
{
//Style View
//Add gesture recognizers
//Add Subviews
[self setNeedsUpdateConstraints];
}
- (void)updateConstraints
{
//Add custom constraints
[super updateConstraints];
}
Проблема
Есть случаи, когда -updateConstraints запускается несколько раз (например, когда контроллер представления представлен или помечен w/animation). Проблема здесь в том, что каждое добавленное ограничение добавляется повторно. Это становится серьезной проблемой при попытке по требованию изменить константу добавленного ограничения, так как есть два первоначальных ограничения, которые впоследствии конфликтуют друг с другом. Я предполагаю, что даже когда вы не манипулируете ограничениями после их создания, удваивайте то, что вам кажется нехорошим.
Потенциальные решения
1 - Удалите все ограничения, влияющие на представление перед их применением в -updateConstraints:
- (void)updateConstraints
{
//Remove all constraints affecting view & subviews
//Add custom constraints
[super updateConstraints];
}
2 - Установите флаг макета и проверьте его перед добавлением пользовательских ограничений:
- (void)updateConstraints
{
if (self.didAddConstraints) {
[super updateConstraints];
return;
}
//Add custom constraints
self.didAddConstraints = YES;
[super updateConstraints];
}
3 - Не беспокойтесь о удвоении ограничений, и всякий раз, когда требуется изменить константу, удалите это ограничение перед повторным добавлением.
3 - Что-то удивительное, о котором я не думал.
Какая самая лучшая практика здесь?