Авторазмер Маска Странное поведение
Я в UIViewController, self.view
указывает на действительный вид с рамкой 300x480.
UIView *redView;
UIView *blueView;
//[[self view] setAutoresizingMask:YES]; //WRONG!
[[self view] setAutoresizesSubviews:YES];
[[self view] setClipsToBounds:YES];
redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
[redView setBackgroundColor:[UIColor redColor]];
[redView setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
[[self view] addSubview:redView];
blueView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[blueView setBackgroundColor:[UIColor blueColor]];
[blueView setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
[[self view] addSubview:blueView];
С этим фрагментом кода, который я пытался
- Чтобы выровнять 200x200 красный вид по правому краю,
- Выровнять синий вид 100x100 по левому краю;
но результат, как вы можете видеть, далек от того, что я ожидал...
http://imageshack.us/photo/my-images/27/iossimulatorscreenshoto.png/
Я прочитал каждый кусочек документации Apple и каждый результат Google об использовании маски автоматического изменения размера, но я до сих пор не могу понять, почему это происходит.
Может кто-нибудь, пожалуйста, объясните мне, что происходит?
Заранее спасибо.
1 ответ
Имейте в виду, что это маска с автоматическим изменением размера, а не маска с автоматическим изменением размера. Это ничего не делает, пока что-то не изменит размер.
То, что вы хотите сделать, это определить фреймы ваших представлений точно там, где вы хотите, чтобы они были в соответствии с текущим размером вашего родительского представления, то есть 300 x 480. Так, например,
redView = [[UIView alloc] initWithFrame:CGRectMake(100, 0, 200, 200)];
blueView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
Вы устанавливаете их маски автоматического изменения размера до горизонтального выравнивания. Если размер self.view изменится, то redView и blueView останутся заблокированными на полях.
Вы должны установить по крайней мере одно из гибкого верхнего поля, гибкого нижнего поля или гибкой высоты. В противном случае поведение не определено, если родительское представление изменяет высоту. Невозможно, чтобы все эти три параметра оставались фиксированными в пределах двух разных высот.
Эта строка кода не имеет смысла:
[[self view] setAutoresizingMask:YES];
Это не ошибка компилятора, потому что BOOL может быть преобразован в UIViewAutoresizing, который является перечислением. В результате YES = 1 = UIViewAutoresizingF FlexibleLeftMargin. Вероятно, не то, что вы хотели. Скорее всего, вы хотели:
[[self view] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
Если вы можете, вы должны сделать все это в Интерфейсном Разработчике. Так как это редактор WYSIWYG, вы можете SWYG ("посмотрим, что вы получите"). Вы можете быстро поиграть с опциями и узнать, как они работают. Гораздо быстрее, чем редактировать - компилировать - запускать, чтобы увидеть эффекты. Даже если вы не можете / не будете использовать Interface Builder для своего проекта, попробуйте с ним пример проекта, чтобы узнать, как работает автоматическое изменение размера. Как только вы знаете, вы можете сделать это в коде с меньшим количеством проб и ошибок. Но обратите внимание на то, что включение полосы полей в Интерфейсном Разработчике эквивалентно отключению соответствующей опции FlexibleXYZMargin в коде.