【问题标题】:Autoresizing Mask Strange Behavior自动调整蒙版奇怪行为
【发布时间】:2012-05-22 18:23:19
【问题描述】:

我在 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];

我正在尝试使用这个 sn-p 代码

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

但你所看到的结果与我所期望的相差甚远......

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

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

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

提前致谢。

【问题讨论】:

    标签: ios uiview autoresizingmask


    【解决方案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 = UIViewAutoresizingFlexibleLeftMargin。可能不是你想要的。您更可能想要:

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

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

    【讨论】:

    • 抱歉,[[self view] setAutoresizingMask:YES]; 实际上是 [[self view] setAutoresizesSubviews:YES];。我将尝试配置[self view]setAutoresizingMask。有什么方法可以添加子视图,使其与边框对齐而不指定位置?我想使用尽可能少的像素引用,因为代码可以在 iPhone 和 iPad 上运行。
    • 我还注意到,如果我以纵向模式进入屏幕[[self view] frame]320x460,但如果我以横向模式进入屏幕它是300x480。这让我有点困惑,因为在风景中我必须将一个对象定位在(100, 0) 以使其出现在应该是(280, 0) 的位置。有什么原因吗?
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多