Swift:不能在Superview中使用NSLayoutConstraint来管理UIView

时间:2016-11-11 16:15:17

标签: ios swift nslayoutconstraint

我试图将视图置于父视图的中心,但它没有按预期居中。这是我的代码和结果的屏幕截图。

emptyView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(emptyView)
let centerXConstraint = NSLayoutConstraint(item: emptyView, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0)
let centerYConstraint = NSLayoutConstraint(item: emptyView, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1, constant: 0)
self.view.addConstraints([centerXConstraint])
self.view.addConstraints([centerYConstraint])

Preview

2 个答案:

答案 0 :(得分:2)

这是代码,

import UIKit

class ViewController: UIViewController
{
    @IBOutlet weak var emptyView: UIView!

    override func viewDidLoad()
    {
        super.viewDidLoad()
        self.emptyView.translatesAutoresizingMaskIntoConstraints = false
        let centerXConstraint = NSLayoutConstraint(item: emptyView, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0)
        let centerYConstraint = NSLayoutConstraint(item: emptyView, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1, constant: 0)
        let widthConstraint = NSLayoutConstraint(item: emptyView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)
        let heightConstraint = NSLayoutConstraint(item: emptyView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)

        self.view.addConstraints([centerXConstraint, centerYConstraint, widthConstraint, heightConstraint])
        self.view.layoutIfNeeded()
    }
}

如果您使用标签或按钮或任何其他具有固有尺寸的视图,则不需要高度和宽度约束

ViewController接口:

enter image description here

输出:

enter image description here

答案 1 :(得分:0)

试试此代码

emptyView.translatesAutoresizingMaskIntoConstraints = false
let widthConstraint = NSLayoutConstraint(item: emptyView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: emptyView.frame.size.width)
let heightConstraint = NSLayoutConstraint(item: emptyView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: emptyView.frame.size.height)
var constraints = NSLayoutConstraint.constraints(
        withVisualFormat: "V:[superview]-(<=1)-[label]",
        options: NSLayoutFormatOptions.alignAllCenterX,
        metrics: nil,
        views: ["superview":view, "label": emptyView])

view.addConstraints(constraints)

// Center vertically
constraints = NSLayoutConstraint.constraints(
        withVisualFormat: "H:[superview]-(<=1)-[label]",
        options: NSLayoutFormatOptions.alignAllCenterY,
        metrics: nil,
        views: ["superview":view, "label": emptyView])

view.addConstraints(constraints)
view.addConstraints([ widthConstraint, heightConstraint])