Променям някакъв код от XIBs към сценарий. Изглежда има съществена разлика във времето за задаване на граници на кадъра на подизгледите на сцена от разкадровка.
Техника, която този код често използва, е следната:
- подизглед на 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);
Проблемът ми е, че при XIBs това работи добре: успях да видя, че размерите на региона, който трябваше да начертая, бяха 200 точки широки (например), а клетките можеха да бъдат начертани 50 точки широки.
Под Storyboards това вече не работи за мен: получавам рамка от (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