在代码和IB之间组织NSLayoutContraints

时间:2013-03-14 18:19:15

标签: iphone ios ipad nslayoutconstraint

我确信这一定是个常见问题。我有一个UIViewController,它有一个UINavigation栏和一个ContentView(包含UIView和一堆子控件。用户可以通过向左滑动隐藏这个内容视图,然后它会动画离开屏幕的左侧。我想要导航bar可以扩展并填充整个宽度。您不能将这两个链接到Interface Builder,因此必须在代码中完成。没问题:

    // Called from viewWillAppear
    -(void)addLayoutConstraints{
        UINavigationBar *navigationBar = self.navigationBar;
        UIView *facetView = self.facetViewController.view;
        NSDictionary *views = NSDictionaryOfVariableBindings(navigationBar, facetView);
        NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[facetView]-[navigationBar]-|"
                                                                                options:NSLayoutFormatAlignAllBaseline
                                                                                metrics:nil
                                                                                  views:views];
        [self.view addConstraints:constraints];

    }

该代码剪断应该做得很好。问题是我已经在IB中布置了UINavigationBar,这样我就可以轻松地为它添加自定义按钮并查看它等等...问题是当我在IB中布置导航栏时,IB添加了一堆无法删除的默认约束。其中一个与我在上面的代码中添加的一个冲突。

你如何解决这个问题?以下是我提出的3种可能性:

1。)我也可以通过编程方式创建UINavigation栏。这样它只有我添加的约束。我不希望这样做,但这是一个选择

2。)使用IB,以某种方式删除默认约束,以便它们不会发生碰撞。我没有办法做到这一点

3.。)在代码中,删除IB添加到UINavigation栏的默认约束,然后添加我的自定义约束。我确实看到有removeConstraint和removeConstraints。我想我可以检索约束,删除它们,然后添加我自己的约束。再一次,有点长时间凌乱的过程。

你有什么看法?你做过类似的事吗?

1 个答案:

答案 0 :(得分:0)

选项3是所谓的方式。在WWDC 2012会议中正好讨论了这个问题 - Introduction to Auto Layout for iOS and OS X