自上周以来我一直试图解决这个问题,而没有更进一步 . 好的,所以我需要使用以下代码将 Swift 中的一些 constraints programmatically 应用于 UIView
:
var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100));
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);
var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0);
self.view.addConstraint(constX);
var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0);
self.view.addConstraint(constY);
var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0);
self.view.addConstraint(constW);
var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0);
self.view.addConstraint(constH);
但Xcode返回这个奇怪的输出:
2014-10-03 09:48:12.657 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea4516c0 h=--& v=--& UIView:0x7fa4ea429290.midX == + 50>",
"<NSLayoutConstraint:0x7fa4ea452830 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa4ea4470f0(375)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea446db0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in
<UIKit/UIView.h> may also be helpful.
2014-10-03 09:48:12.658 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea451b30 h=--& v=--& UIView:0x7fa4ea429290.midY == + 50>",
"<NSLayoutConstraint:0x7fa4ea44cf00 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa4ea4470f0(667)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea452700 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
你能帮助我吗?非常感谢
15 回答
我在给定的图中创建了这些视图 . 以编程方式使用Autolayout . 您将深入了解约束以及如何正确应用它们 .
你可以在这里参考"Introduction to Autolayout"
你是否打算在
UIView
的UIView
内设一个宽度为UIView
的平方:100和高度:100?如果是这样,您可以尝试以下6种自动布局样式中的一种(Swift 4.2 / iOS 12):1.使用NSLayoutConstraint初始化程序
2.使用可视格式语言
3.使用NSLayoutConstraint初始化程序和Visual Format语言的混合
4.使用UIView.AutoresizingMask
注意:Springs和Struts将在运行时转换为相应的自动布局约束 .
5.使用NSLayoutAnchor
6.使用intrinsicContentSize和NSLayoutAnchor
结果:
它帮助我在视觉上学习,所以这是一个补充的答案 .
Boilerplate代码
以下每个示例都独立于其他示例 .
Pin左边缘
myView.leading = leadingMargin + 20
Method 1: Anchor Style
leadingAnchor
外,还有trailingAnchor
,topAnchor
和bottomAnchor
.Method 2: NSLayoutConstraint Style
除
.leading
外,还有.trailing
,.top
和.bottom
.除
.leadingMargin
外,还有.trailingMargin
,.topMargin
和.bottomMargin
.设置宽度和高度
width = 200
height = 100
Method 1: Anchor Style
Method 2: NSLayoutConstraint Style
容器中心
myView.centerX = centerX
myView.centerY = centerY
Method 1: Anchor Style
Method 2: NSLayoutConstraint Style
注意事项
锚式样式是
NSLayoutConstraint
Style的首选方法,但它仅适用于iOS 9,所以如果你支持iOS 8,那么你仍然应该使用NSLayoutConstraint
Style .上面的例子只显示了一个或两个正在关注的约束 . 但是,为了在我的测试项目中正确放置
myView
,我需要有四个约束 .进一步阅读
如果你想填写你的超级视图,那么我建议采用这种方式:
其他明智的,如果您需要非相等的约束,请查看iOS 9中的NSLayoutAnchor . 通常直接使用NSLayoutConstraint更容易阅读:
正如错误消息所暗示的那样,问题是您的
NSAutoresizingMaskLayoutConstraints
类型的约束与您的显式约束冲突,因为new_view.translatesAutoresizingMaskIntoConstraints
设置为true .这是您在代码中创建的视图的默认设置 . 你可以这样关掉它:
此外,您的宽度和高度限制是奇怪的 . 如果您希望视图具有恒定宽度,这是正确的方法:
(将100替换为您希望的宽度 . )
如果您的部署目标是iOS 9.0或更高版本,则可以使用此更短的代码:
无论如何,对于这样的布局(固定大小并在父视图中居中),使用自动调整掩码并让系统将掩码转换为约束会更简单:
请注意,即使您还使用自动布局,使用自动调整也是完全合法的 . (UIKit仍然在内部的许多地方使用自动调整 . )问题是很难将其他约束应用于使用自动调整大小的视图 .
操场上多个视图的约束 .
swift 3+
通过对图像应用约束来实现自动布局 . 使用NSLayoutConstraint . 可以在所有设备上实现理想而美观的设计 . 请尝试以下代码 .
它在xcode 7.3.1中略有不同 . 这就是我想出的
Updated for Swift 3
Type of Constraints
这是以编程方式添加约束的一种方法
Would like to add some theoretical concept to Imanou Petit’s answer, so that one can understand how auto layout works.
要了解自动布局,请将您的视图视为最初收缩的 rubber's object .
To place an object on screen we need 4 mandatory things :
对象的X坐标(水平位置) .
对象的Y坐标(垂直位置)
对象的宽度
物体的高度 .
1 X coordinate: 有多种方法可以为视图提供x坐标 .
如前导约束,尾随约束,水平中心等 .
2 Y coordinate: 有多种方法可以为视图提供y坐标:
如顶部约束,底部约束,垂直中心等 .
3 Object's width: 有两种方法可以为视图提供宽度约束:
一个 . 添加固定宽度约束(将此约束视为固定宽度的铁棒,并且您已将橡胶的物体水平地与其连接,因此橡胶的物体不会收缩或膨胀)
b. Do not add any width constraint but add x coordinate constraint to both end of view trailing and leading, these two constraints will expand/shrink your rubber’s object by pulling/pushing it from both end, leading and trailing.
4 Object's height: 与宽度类似,有两种方法可以为视图赋予高度约束:
一个 . 添加固定高度约束(将此约束视为固定高度的铁杆,并且您已将橡胶的物体垂直地与其连接,因此橡胶的物体不会收缩或膨胀)
b. Do not add any height constraint but add x coordinate constraint to both end of view top and bottom, these two constraints will expand/shrink your rubber’s object pulling/pushing it from both end, top and bottom.
如果你发现上面的丑陋 . 您应该考虑使用DSL进行约束 . 例如SnapKit使约束API更加用户友好
基本上它涉及3个步骤
这将标签“hello world”放在屏幕的中心 .
请参考链接Autolayout constraints programmatically
您正在将所有已定义的约束添加到
self.view
,这是错误的,因为应将宽度和高度约束添加到newView
.另外,据我所知,你想设置恒定的宽度和高度100:100 . 在这种情况下,您应该将代码更改为: