我正在从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,multiplier: 1,constant: 0)) view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .LeadingMargin,constant: 0)) } view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .Top,toItem: self.topLayoutGuide,attribute: .Bottom,constant: 0)) view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .Height,toItem: nil,attribute: .NotAnAttribute,constant: 131)) }
我正在尝试做什么:实际上适合我的视图约束它顶部,前导,尾随到ViewController的视图,并具有前缀高度.我添加到主视图的视图有自己的透明背景视图,因此不需要边距(视图意味着设备的宽度大小,所以).
我已经放置了两对本来应该相等的线(在我的尝试中)和if,因为if中的前两行实际上在iOS9中可用>只是,虽然我试图在else语句中为每个设备做同样的事情(从iOS 8开始).
这就是我得到的:
左边是iOS9,右边是iOS8.透明背景被涂成红色以显示发生了什么(不要介意在图像中的不同高度,它们在应用程序中的高度相等,而是在左侧和右侧查看增加的边距)
我也试过AutoLayoutDSL-Swift,但没有帮助,我不是专家,但每次尝试都只会让事情变得更糟.
如何使用经典的NSLayoutConstraints方法编写这些约束,以及如何使用AutoLayoutDSL或其分支框架以更好的方式编写所有约束? (或另一种选择,但现在大部分时间我都关注官方文库)
解决方法
您需要使用前导和尾随属性,而不是leadingMargin和trailingMargin属性:
override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) ... ... view!.addSubview(gamePreview) gamePreview.translatesAutoresizingMaskIntoConstraints = false view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .Trailing,constant: 0)) view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .Leading,constant: 0)) view.addConstraint(NSLayoutConstraint(item: gamePreview,constant: 131)) }