如何为故事板中的单个视图控制器打开/关闭自动布局

时间:2014-08-31 13:00:03

标签: ios objective-c storyboard autolayout

我想在故事板中打开/关闭单个视图控制器的自动布局(我相信称为场景)

当我转到故事板中的特定场景,并更改检查器中的Use Auto Layout复选框时,我会为整个故事板场景打开/关闭自动布局。

我无法理解这种行为,因为对于一个这个复选框看起来像一个特定场景的属性而不是整个故事板,其次我不明白为什么一个场景布局与其他场景有关。

这甚至可能吗?它可以在故事板中使用,也可能只在代码中使用?

2 个答案:

答案 0 :(得分:24)

这可能看起来像“使用自动布局”复选框用于特定场景,但正如您所发现的那样,它是整个“界面生成器文档”(即整个故事板)。因此,如果您不想在特定场景中使用自动布局,您可能会遇到一些选择:

  1. 您可以将此其他场景放在不同的故事板或NIB中,并以编程方式转换到视图控制器和从视图控制器转换。如果你这样做,你会失去许多故事板的好处(例如,你不能只在IB中来回创建segues,而是必须以编程方式过渡到这个场景)。

  2. 您可以启用自动布局,但是对于有问题的一个视图控制器,您可以通过编程方式进行:

    • 删除IB可能添加的任何约束(特别是在Xcode 6中);

    • 调整各种控件的autoresizingMask。如果您希望尊重autoresizingMask,则可能需要启用translatesAutoresizingMaskIntoConstraints;以及

    • 如果使用Xcode 6,您可能还想关闭“使用大小类”,以便正确地为目标设备布置场景。

    所以,按照我想要的方式布置我的标签,我可以:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self.view removeConstraints:self.view.constraints];
        [self.label removeConstraints:self.label.constraints];
        self.label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
        self.label.translatesAutoresizingMaskIntoConstraints = YES;
    }
    

    显然,你设置autoresizingMask的内容完全取决于你(在这个例子中,我把一个标签放在场景中心,所以上面让它保持居中,因为我去景观),但希望这说明这个想法。

  3. 坦率地说,鉴于在自动布局中无法轻易表达的自动调整遮罩,你无法做任何事情,我倾向于坚持使用自动布局,并且消除了上述方法的尴尬。

答案 1 :(得分:0)

您可以将单个视图控制器的布局移动到单独的xib文件并以编程方式加载它。如果您只是不想定义自己的约束,可以将控制器留在故事板中,而不是添加约束。在这种情况下,将根据VC的子视图'在运行时自动为您生成约束。帧。