居中使用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/
- 使用自动布局,如何使UIImageView的大小dynamic取决于图像?
- 使用自动布局约束dynamic调整表格视图单元格大小
- iOS的topLayoutGuide使用iOS 7和iOS 8之间的子视图控制器的区别
- AutoLayout – 保持图像水平约束的比例(Swift Xcode 6)
- 在UITableViewCell的子视图上设置遮罩层将覆盖自动布局约束
- 组表TableView,使用自调整节标题,重新加载后,如果向上滚动,tableview将跳转
- 使用自动布局使UILabel和UITextField相邻
- 自动布局具有dynamic高度子视图的UIScrollView
- UITableView缺less新的可见行NSInternalInconsistencyException的单元格