Авторазмер Маска Странное поведение - PullRequest
2 голосов
/ 08 октября 2011

Я нахожусь в 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];

С этим фрагментом кода, который я пытался

  1. Чтобы выровнять вид красного цвета 200x200 по правому краю,
  2. Чтобы выровнять синий вид 100x100 с левым полем;

но результат, который вы видите, далек от того, чего я ожидал ...

http://imageshack.us/photo/my-images/27/iossimulatorscreenshoto.png/

Я прочитал каждый кусочек документации Apple и каждый результат Google об использовании маски с автоматическим изменением размера, но я все еще не могу понять, почему это происходит.

Может кто-нибудь объяснить мне, что происходит?

Заранее спасибо.

1 Ответ

5 голосов
/ 09 октября 2011

Имейте в виду, что это маска с автоматическим изменением размера, а не маска с автоматическим изменением размера. Он ничего не делает, пока что-то не изменит размер.

То, что вы хотите сделать, это определить фреймы ваших представлений точно там, где вы хотите, чтобы они были в соответствии с текущим размером вашего родительского представления, то есть 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 в коде .

...