Авторазмер Маска Странное поведение

Я в 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 ответ

Решение

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

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

Другие вопросы по тегам