2013-03-14 35 views
0

我相信这肯定是一个常见问题。我有一个UIViewController,它有一个UINavigation栏和一个ContentView(它包含UIView和一堆儿童控件,用户可以通过向左滑动来隐藏这个内容视图,然后在屏幕左侧显示动画。棒扩展和填充整个宽度不能链接这两个与界面生成器,所以它必须在代码来完成没有问题:。组织代码和IB之间的NSLayoutContraints

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

选项3是要走的路。您可以将IBOutlets制作为IB为您创建的任何约束,然后删除它们或修改常数值。 – rdelmar 2013-03-14 18:51:43

+0

你如何做到这一点?我做了像NSArray * constraints = navBar.constraints seomthing; [self.view removeConstraints:constraints];这似乎删除了其中的一些。我很好奇你想告诉我什么。 – VaporwareWolf 2013-03-14 18:58:39

+0

您制作IBOutlets,并将它们连接到IB中的约束,就像您使用任何其他IBOutlet一样(有时您可以单击UI元素以便您可以看到约束并将它们连接到那里,或者可以连接到列表屏幕左侧场景列表中的约束条件)。然后在代码中,使用插座名称将其删除。 – rdelmar 2013-03-14 19:02:33

回答

0

选项3是假定的方式。在本次WWDC 2012会议中正是提到 - Introduction to Auto Layout for iOS and OS X

+0

请注意,只有链接的答案是不鼓励的(链接往往会随着时间的推移变得陈旧)。 请考虑编辑您的答案并在此处添加摘要。 – kleopatra 2013-04-20 09:01:24

+0

这不是一个仅链接的答案。我在第一句话中回答了这个问题。第二句包含支持我的答案的*视频*的链接。 – an0 2013-04-20 13:56:32

+0

同意,这有点临界:-)嗯,有理由选择选项3,不是吗?对于一个好的答案,我希望你至少总结一下。 – kleopatra 2013-04-20 14:34:02