2

我在 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/

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

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

提前致谢。

4

1 回答 1

5

请记住,它是一个自动调整大小的蒙版,而不是一个自动调整大小的蒙版。在某些东西改变大小之前,它不会做任何事情。

您要做的是根据父视图的当前大小(即 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中打开边距栏相当于在代码中关闭相应的 FlexibleXYZMargin 选项。

于 2011-10-08T20:09:59.210 回答