При программном создании макетов я следую рекомендациям 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 - Что-то удивительное, о котором я не думал.
Какая самая лучшая практика здесь?