iOS: добавление новых ограничений в пользовательском представлении зависит от фрейма представления

Я пытаюсь понять, когда переопределить layoutSubviews против updateConstraints,

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

В настоящее время у меня есть это:

-(void)layoutSubviews
{
    [super layoutSubviews];
    // Add new constraints
}

Затем, когда я добавляю или удаляю любое из подпредставлений, я звоню [self setNeedsLayout];

Это правильный способ сделать это? В настоящее время я воссоздаю ограничения всякий раз, когда layoutSubviews называется. Я слышал это updateConstraints может быть, что я хочу? Но я не уверен, так как количество подпредставлений не остается постоянным, и, следовательно, количество ограничений также не будет постоянным.

1 ответ

Решение

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

Методы layoutSubvews а также updateConstraints являются обратными вызовами, и они вызываются в определенных точках в цикле макета. В частности, они вызываются несколько раз, и это автоматически запрещает вам использовать ограничения, поскольку существует опасность создания ограничений более одного раза.

Как указано в документации, layoutSubviews следует использовать только тогда, когда

если авторазмер и основанные на ограничениях поведения подпредставлений не предлагают нужного вам поведения.

Если layoutSubviews вызывается, текущее автоматическое размещение выполнено, и добавление, удаление или изменение ограничений может повторно запустить процесс размещения. Это может сильно замедлить ваше приложение.

Документация для updateConstraints включает в себя также четкое утверждение, когда вы должны перезаписать его:

Переопределите этот метод, чтобы оптимизировать изменения ваших ограничений.

Изменение ограничений не означает добавление ограничений. Если вам нужны разные ограничения для ваших представлений в разное время, вы можете deactivate неиспользованный и activate необходимые ограничения во время выполнения. Это можно сделать в updateConstraints,

Кстати: (явный) вызов setNeedsLayout обычно не требуется, особенно если вы изменили иерархию представления или ограничения макета.

Другие вопросы по тегам