Я меняю код с XIB на раскадровку. Кажется, существует существенная разница во времени установки границ кадра для подвидов сцены раскадровки.
Техника, которую часто использует этот код, такова:
- подпредставление UIView имеет размеры, определенные в XIB или файле раскадровки (что позволяет кому-то, кроме программиста, изменять пользовательский интерфейс)
- UIViewController имеет ссылку на объект как
IBObject UIView *
- в
- viewWillAppear()
UIViewController выполняются определенные вычисления, и на основе этих вычислений выполняется рисование.
Например, в нашем файле XIB или Storyboard есть UIView, который мы хотим разделить на четыре области. Контроллер смотрит на границы этого UIView, смотрит на его фрейм, а затем в UIView рисует четыре прямоугольника, каждый в четверть размера.
In .h:
IBOutlet UIView *outputColorKeyView;
In .m's viewWillAppear
:
CGRect keyBounds = [outputColorKeyView bounds];
float high = keyBounds.size.height;
float wide = keyBounds.size.width;
float cellWidth = wide/4.0;
XLog(@"Dimensions for the color key are: %f %f", high, wide);
Моя проблема в том, что в XIB это работало нормально: я смог увидеть, что размеры области, которую я должен был нарисовать, были шириной 200 точек (например), а ячейки могли быть нарисованы шириной 50 точек.
В раскадровках это больше не работает для меня: я получаю кадр (0,0,0,0), когда я звоню из метода viewWillAppear
контроллера:
[18:09:16.901|4096] Dimensions for the color key are: 0.000000 0.000000
Однако при запуске с более позднего этапа жизненного цикла программы (запускается кнопкой) я получаю правильный результат:
[18:09:35.812|4096] Dimensions for the color key are: 36.000000 734.000000
Есть ли способ получить эту информацию до появления представления? Я бы так подумал, но viewWillAppear
кажется последней возможностью перед тем, как представления будут фактически отображены. Или есть какой-то очевидный переключатель, который я упустил, который заставит эту технику работать так, как задумано?
Спасибо
IBOutlet
подключен правильно и представление является правильным подпредставлением свойстваview
контроллера представления, то оно должно быть доступно уже вviewDidLoad:
... то есть доviewWillAppear:
. - person Phillip Mills   schedule 15.11.2012- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"---------------------------"); NSLog(@"viewDidLoad[TestGameController]: my view is: %@", [self view]); NSLog(@"viewDidLoad[TestGameController]: my subview1 is: %@", subViewOne); }
- person Todd Masco   schedule 16.11.2012