iOS: добавление новых ограничений в пользовательском представлении зависит от фрейма представления
Я пытаюсь понять, когда переопределить layoutSubviews
против updateConstraints
,
Я создал собственный вид, и этот вид содержит другие виды. Я не могу установить ограничения для подпредставлений представления в имеющемся у меня пользовательском инициализаторе, поскольку еще не знаю фрейм пользовательского представления.
В настоящее время у меня есть это:
-(void)layoutSubviews
{
[super layoutSubviews];
// Add new constraints
}
Затем, когда я добавляю или удаляю любое из подпредставлений, я звоню [self setNeedsLayout];
Это правильный способ сделать это? В настоящее время я воссоздаю ограничения всякий раз, когда layoutSubviews
называется. Я слышал это updateConstraints
может быть, что я хочу? Но я не уверен, так как количество подпредставлений не остается постоянным, и, следовательно, количество ограничений также не будет постоянным.
1 ответ
Вы должны добавить ограничение при добавлении подпредставлений. Вы можете сделать это для каждого подпредставления индивидуально или в пользовательском методе, если это можно обобщить.
Методы layoutSubvews
а также updateConstraints
являются обратными вызовами, и они вызываются в определенных точках в цикле макета. В частности, они вызываются несколько раз, и это автоматически запрещает вам использовать ограничения, поскольку существует опасность создания ограничений более одного раза.
Как указано в документации, layoutSubviews
следует использовать только тогда, когда
если авторазмер и основанные на ограничениях поведения подпредставлений не предлагают нужного вам поведения.
Если layoutSubviews
вызывается, текущее автоматическое размещение выполнено, и добавление, удаление или изменение ограничений может повторно запустить процесс размещения. Это может сильно замедлить ваше приложение.
Документация для updateConstraints
включает в себя также четкое утверждение, когда вы должны перезаписать его:
Переопределите этот метод, чтобы оптимизировать изменения ваших ограничений.
Изменение ограничений не означает добавление ограничений. Если вам нужны разные ограничения для ваших представлений в разное время, вы можете deactivate
неиспользованный и activate
необходимые ограничения во время выполнения. Это можно сделать в updateConstraints
,
Кстати: (явный) вызов setNeedsLayout
обычно не требуется, особенно если вы изменили иерархию представления или ограничения макета.