Как да получите рамки за подизгледи в началото на процеса на инициализация

Променям някакъв код от 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 изглежда като последната възможност преди изгледите да бъдат действително изобразени. Или има някакъв очевиден превключвател, който пропускам, който ще накара тази техника да работи по предназначение?

Благодаря


person Todd Masco    schedule 15.11.2012    source източник
comment
Нещо друго се случва там. Ако IBOutlet е свързан правилно и изгледът е правилен подизглед на свойството view на контролера на изгледа, тогава той трябва да е достъпен още от viewDidLoad:...което е преди viewWillAppear:.   -  person Phillip Mills    schedule 15.11.2012
comment
Добре, благодаря - добре е да знам. Кодът е пуснат направо от версията на XIB, така че изглежда, че трябва да работи идентично - но фактът, че размерите не са налични от viewWillAppear, но не са налични по-късно (без манипулиране на изгледа от друг друг метод) ме накара чудейки се.   -  person Todd Masco    schedule 15.11.2012
comment
Основната ми мисъл беше дали може да има настройка за UIView в Storyboard, която не очевидно има този фин страничен ефект. Ще се опитам да дублирам проблема в някакъв нов код.   -  person Todd Masco    schedule 15.11.2012
comment
Добре, получавам същото поведение от напълно нов проект, празен сценарий (това е втората сцена, свързана с един бутон с преход към режима).   -  person Todd Masco    schedule 16.11.2012
comment
Празен сценарий с изключение на две сцени (това е втората сцена, свързана с един бутон с преход към режима). Втората сцена е един UIView. Когато правя това в изгледаDidLoad на контролера на сцената: - (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
comment
Получавам: 2012-11-15 14:38:03.801 testStoryBoardSubViews[10666:c07] viewDidLoad[TestGameController]: моят изглед е: ‹UIView: 0x10019910; рамка = (0 20; 768 1004); автоматично преоразмеряване = RM+BM; слой = ‹CALayer: 0x10019970›› 2012-11-15 14:38:03.801 testStoryBoardSubViews[10666:c07] viewDidLoad[TestGameController]: моят подизглед1 е: ‹UIView: 0x10019760; рамка = (0 0; 0 0); автоматично преоразмеряване = TM+BM; слой = ‹CALayer: 0x100197c0››   -  person Todd Masco    schedule 16.11.2012


Отговори (1)


Отговорът беше даден в отговор на моя допълнителен въпрос ... мястото, където трябва да се направи тези неща са след като оформлението е готово, в viewDidLayoutSubviews

Не ми е ясно защо информацията се е променила, от данните в първоначалния файл с описание (независимо дали XIB или Storyboard), които са били налични още на viewDidLoad, до сега (0,0,0,0), но е разлика, която трябва да имате предвид, ако следвате много от кода на ръководството в книгите и в мрежата.

person Todd Masco    schedule 16.11.2012
comment
Мисля, че открих, че ключовият елемент в уравнението е дали автоматичното оформление е активирано или не за xib/storyboard. Без автоматично оформление рамките, установени в IB, се използват за настройка на размерите на изгледа в йерархията по време на зареждане. Когато автоматичното оформление е активирано, оразмеряването се отлага до оформлението на подизглед (както споменахте по-горе). - person Phillip Mills; 16.11.2012