自动化蒙版奇怪的行为

时间:2011-10-08 18:56:50

标签: ios uiview 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];

使用这段代码我正在尝试

  1. 将200x200红色视图对齐到右边距,
  2. 将100x100蓝色视图对齐到左边距;
  3. 但你可以看到的结果远非我所期待的......

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

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

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

    提前致谢。

1 个答案:

答案 0 :(得分:5)

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

您要做的是根据父视图的当前大小(即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 = UIViewAutoresizingFlexibleLeftMargin。可能不是你想要的。你更有可能想要:

[[self view] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];

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