我从xib中添加一个视图到ViewController中,然后设置它的约束以实际适应它
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
...
...
view!.addSubview(gamePreview)
gamePreview.translatesAutoresizingMaskIntoConstraints = false
if #available(iOS 9.0, *) {
// Pin the leading edge of myView to the margin's leading edge
gamePreview.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true
//Pin the trailing edge of myView to the margin's trailing edge
gamePreview.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true
} else {
// Fallback on earlier versions
view.addConstraint(NSLayoutConstraint(item: gamePreview, attribute: .TrailingMargin, relatedBy: .Equal, toItem: view, attribute: .TrailingMargin, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: gamePreview, attribute: .LeadingMargin, relatedBy: .Equal, toItem: view, attribute: .LeadingMargin, multiplier: 1, constant: 0))
}
view.addConstraint(NSLayoutConstraint(item: gamePreview, attribute: .Top, relatedBy: .Equal, toItem: self.topLayoutGuide, attribute: .Bottom, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: gamePreview, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute,multiplier: 1, constant: 131))
}
我想做的是:为了实际适合我的视图,将其限制在ViewController视图的顶部、前导、尾随,并带有一个前缀高度。我添加到主视图的视图有它自己的透明背景视图,因此不需要边距(该视图是为了设备的宽度大小,因此)。
我已经放置了两对应该相等的行(在我的尝试中),带有if,因为if中的前两行实际上只在iOS9〉中可用,而我正在尝试在else语句中为每个设备(从iOS8开始)做同样的事情。
这是我得到的:
iOS9+在左边,iOS8+在右边。透明背景被涂成红色,以显示发生了什么(不介意在不同的高度的图像,他们在应用程序中是相同的高度,而不是看左边和右边增加的边距)
我也尝试了AutoLayoutDSL-Swift
,但没有帮助,我不是它的Maven,但每一次尝试只会使事情变得更糟。
如何使用经典的NSLayoutConstraints方法编写这些约束,以及如何使用像AutoLayoutDSL这样的框架或它的分支以更好的方式编写所有这些约束?(或者另一种方法,尽管现在我主要关注官方库)
4条答案
按热度按时间des4xlb01#
您需要使用
leading
和trailing
属性,而不是leadingMargin
和trailingMargin
属性:j2cgzkjk2#
多亏了@Paulw11......这就是解决方案
此外,我设法重写它如下使用
AutoLayoutDSL-Swift
为任何人感兴趣最后一行有点长,因为view.top指的是真正的视图顶部,而没有考虑statusBar和navigationBar高度添加的填充。它们可以被替换为常量,等待有人提出更优雅的解决方案。
tzdcorbm3#
SWIFT 4更新
5us2dqdw4#
为什么不使用约束激活?您可以这样做:
这是另一个。希望它能有所帮助。你可以根据父/子交换
view
和gamePreview
,或者你可以为你的约束创建一个通用的助手扩展。我在YouTuber Here提供的教程中找到了一个,并稍微修改了一下,使其接受前导/尾随,左/右约束。你也可以在下面添加safeLayoutGuide
,这使得它更适合未来。就像这样:然后这样称呼它: