居中使用NSLayoutConstraint大UIView

我是新来的使用Autolayouts,即使这是我第一次尝试。 无论我做什么,结果都是以白色屏幕结束。 这是我的尝试。

我有一个UIView ,让我说一个框架(60, 154, 200, 200) parentView 。 这是self.view的子视图。

然后我有一个dynamic的视图,说dynamic视图的帧(0, 0, 260, 100) dynamicView (0, 0, 260, 100)和帧的label (15, 25, 230, 50) dynamicView (15, 25, 230, 50) ,这是一个子视图dynamicView

当我将dynamicView作为子视图添加到dynamicView视图中时,它会从parentView的界限中parentView 。 所以,我想调整dynamicView和它的子( label )的大小,以便它的位置是parentView dynamicView中心, parentView dynamicView是在parentView的边界内。

我第一次尝试设置clipsToBounds ,它不工作在Xcode5,iOS7。 所以下一个选项是使用NSLayoutConstraint实现这个。 我不知道。 我欢迎你的想法。

我只要解决dyanmicView是parentView问题的一部分,然后让你从那里去

第一 :如果你是dynamic创build视图,那么你很好走,但如果你从故事板创build它,你必须从它的父母分离,然后重新附加它..这就是你如何摆脱它以前的NSConstraints(通常是故事板介绍的)可能会与新的NSConstraints相冲突。

你也必须将setTranslatesAutoresizingMaskIntoConstraints设置为NO b / c,这也会干扰你的nsconstraints。

我通常会这样做最后两个步骤,使用mapObjectsUsingBlock使创build约束条件的过程更愉快和自然:

  [@[view_1, view_2, /../, view_n] mapObjectsApplyingBlock:^(UIView *view) { [view removeFromSuperview]; [view setTranslatesAutoresizingMaskIntoConstraints:NO]; [view setHidden:NO]; [superView addSubview:view]; }]; 

那么在应用nsconstraints之前,您必须确保您希望应用约束的视图已经附加到它的父级:

 [parentView addSubview:dynamicView]; 

那么你想创build一个绑定字典:

 NSDictionary *buttonBindingsDictionary = @{ @"parentView" : parentView, @"dynamicView" : dynamicView}; 

那么你想添加使用视觉格式语言的约束..我也在这里使用mapObjectsUsingBlock (我将解释每个约束在英语):

 NSArray *buttonConstraints = [@[@"V:|-[dynamicView(>=200)]-|", @"|-[dynamicView(>=260)]-|", ] mapObjectsUsingBlock:^id(NSString *formatString, NSUInteger idx){ return [NSLayoutConstraint constraintsWithVisualFormat:formatString options:0 metrics:nil views:buttonBindingsDictionary]; }]; 

V:|-[dynamicView(>=200)]-| 意味着垂直方向上, dynamicView和它的父dynamicView之间的上下距离应该是相等的。 dynamicView's高度也应该不小于200

|-[dynamicView(>=260)]-| 意思是说,在水平上说, dyanmicview和它的父母之间的左右距离应该是相等的dyanmicView's宽度也应该不小于260

注意:你可以自己做math运算,并设置dyanicView和它的父母之间的左/右/底/顶部距离。这只是更简单..但有时nsconstraints混乱,我必须自己做。

在这种情况下,它会看起来像这样,其中x是你想出的距离:

 V:|-x-[dynamicView(>=200)]-x-| |-x-[dynamicView(>=260)]-x-| 

那么你必须添加约束到父视图:

 [parentView addConstraints:[buttonConstraints flattenArray]]; 

注意这里我使用了平坦的数组 ,再一次,这是从我的图书馆b / ci的方法喂它一个级别的数组,而不是一个数组的数组。

你很好走!

注意:我知道这可能无法正常工作..但是它给了你怎么做的想法+一些帮手文件。 这需要一些练习,你应该看看一些教程肯定..我build议你开始与nsconstraints使用故事板(你可以select一个视图..然后去编辑>引脚> ..然后select一些..立即得到一些视觉反馈..也可以通过select视图控制器,然后转到属性检查器,并在模拟的度量标准下select不同的大小,来模拟立即在故事板上的3.5“显示器vs 4.0”显示器中的视图。

把你的时间花掉,但有一点是肯定的:一旦你离开,你永远不会回头看! 这是完全值得的!

ps你也可以使用nsconstraints animation视图,以防万一你想知道。

自动布局约束是您尝试实现的最佳方法。 当您检查IB中的使用Autolayout选项时,会自动添加自动布局约束。

查看本教程,该教程将详细介绍iOS6中的自动布局http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

那么你可以检查这个链接的iOS7更新的自动布局http://www.doubleencore.com/2013/09/auto-layout-updates-in-ios-7/