自动化蒙版奇怪的行为

Sca*_*kko 2 uiview ios autoresizingmask

我在一个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];
Run Code Online (Sandbox Code Playgroud)

有了这段代码,我正在尝试

  1. 要将200x200红色视图对齐到右边距,
  2. 将100x100蓝色视图与左边距对齐;

但你可以看到的结果远非我所期待的......

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

我已经阅读了关于自动调整掩码使用的每一点苹果文档和每个谷歌结果,但我仍然无法弄清楚为什么会发生这种情况.

有人可以向我解释发生了什么事吗?

提前致谢.

mor*_*tar 5

请记住,它是一个autoREsizing掩码,而不是自动调整掩码.在某些东西改变大小之前它什么都不做.

你想要做的是完全定义你的意见框架,你希望他们可以根据自己的父视图的电流的大小,即300×480.因此,例如,

redView = [[UIView alloc] initWithFrame:CGRectMake(100, 0, 200, 200)];

blueView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
Run Code Online (Sandbox Code Playgroud)

您正在将其自动调整遮罩正确设置为水平对齐.如果self.view更改大小,则redView和blueView将保持锁定到边距.

您应该设置柔性顶边距,柔性底边距或柔性高度中的至少一个.否则,如果父视图更改高度,则行为未定义.所有这三个参数都不可能在两个不同的高度内保持固定.

这行代码没有意义:

[[self view] setAutoresizingMask:YES];
Run Code Online (Sandbox Code Playgroud)

它不是编译器错误,因为BOOL恰好可以转换为UIViewAutoresizing,这是一个枚举.效果是YES = 1 = UIViewAutoresizingFlexibleLeftMargin.可能不是你想要的.你想要的可能性更大:

[[self view] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
Run Code Online (Sandbox Code Playgroud)

如果可以,您应该在Interface Builder中完成所有这些操作.既然它是WYSIWYG编辑器,你可以SWYG("看你得到的").您可以快速使用这些选项并了解它们的工作原理.比编辑快得多 - 编译 - 运行以查看效果.即使您不能/不会将Interface Builder用于您的项目,也可以尝试使用它的示例项目来了解自动调整的工作原理.一旦你知道你可以用更少的试验和错误在代码中完成它.但请注意,在Interface Builder 中打开边距条相当于在代码中关闭相应的FlexibleXYZMargin选项.