Во-первых, я должен упомянуть, что это в основном проблема эффективности.Расчет рамок в `viewDidLayoutSubviews`
Существует много дискуссий относительно того, где делать кадровые вычисления, где viewWillAppear
слишком рано, и viewDidAppear
слишком поздно (вид уже виден).
Общий ответ заключается в том, чтобы сделать расчеты кадра в viewDidLayoutSubviews
. Проблема в том, что она вызывается несколько раз. Хуже того, самый точный вызов, тот, где все кадры имеют окончательный размер, является последним. Насколько я знаю, нет способа узнать, какой звонок является последним.
Мы используем флаг «frameAreSet» (инициализированный ложь) и проверку, если фрейм не равен нулю (что-то вроде self.view.frame.size.width != 0
), а «framesAreSet» является ложным, он входит, поворачивает флаг и вычисляет только один раз , Что-то вроде:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (self.view.frame.size.width != 0 && !framesAreSet)
{
framesAreSet = true;
//Calculate frames here
}
}
Это выглядит нормально, но на самом деле, проверка на что-то вроде self.view.frame.size.width != 0
делает не гарантии того, что кадры действительно множество. Тот факт, что viewDidLayoutSubviews
будет вызван, предполагает, что некоторые фреймы не установлены в их конечное состояние.
Было бы здорово иметь viewCompleteLayoutSubviews
. Любые идеи о том, какой лучший способ выполнить вычисления «одноразового» кадра, когда все кадры установлены, и представление еще не видно?
(Это, вероятно, проблема с видом не с использованием NSConstraints)
Почему это проблема, вызываемая 'viewDidLayoutSubviews' более одного раза? С какими проблемами вы сталкиваетесь? – rmaddy
Вы случайно не обновляете границы 'self.view' там? Если это ваша проблема. – Clafou
@rmaddy Резервирование - это не хорошая практика кодирования. Предположим, у вас есть сложный ViewController, добавив много подпрограмм в коде (фактически созданных в основном в коде) и выполняйте множество вычислений для фреймов настроек. На самом деле, представьте, что «тяжелые» вычисления вызывают столько раз, сколько добавляют subviews plus. Имейте в виду, что все, кроме последнего, являются излишними. Иногда «это работает» недостаточно. – bauerMusic