使用Swift 4以编程方式将UIView添加到带有NSLayoutConstraints的UITableViewController

时间:2017-12-05 01:03:37

标签: ios uiview nslayoutconstraint swift4 xcode9

我正在尝试添加带有NSLayoutConstraints的UIView但是我一直收到类型NSException错误的未捕获异常。我用代码代替故事板的主要原因是我希望它在UITableViewController上的导航栏上方。

以下是我目前的代码。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let mainWindow: UIWindow = UIApplication.shared.keyWindow!

    let newView = UIView()
    newView.backgroundColor = UIColor.darkAqua
    newView.translatesAutoresizingMaskIntoConstraints = false

    mainWindow.addSubview(newView)

    let viewHeight = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)
    let viewWidth = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)
    let viewLeft = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.left, relatedBy: NSLayoutRelation.equal, toItem: mainWindow, attribute: NSLayoutAttribute.left, multiplier: 1, constant: 40)
    let viewTop = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: mainWindow, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0)

    newView.addConstraints([viewHeight, viewWidth, viewLeft, viewTop])
}

如果我取出viewLeftviewTop,它就会运行正常,因为toItem:NSLayoutConstraint中为零。但我认为问题与toItem:我尝试过使用self.viewmainWindow有关,但它一直在抛出错误。

我已经看过很多关于如何做到这一点的例子,据我所知,我几乎都在复制它们,但是没有一个是Swift 4,所以我想知道Swift 4中是否有什么变化。 / p>

任何帮助都会很棒!谢谢。

错误讯息:

  

libc ++ abi.dylib:以NSException类型的未捕获异常终止   (LLDB)

1 个答案:

答案 0 :(得分:2)

我尝试使用self.view而不是主窗口,并使用不同的布局约束样式。试试这个Jason Brady。

override func viewDidLoad() {
    super.viewDidLoad()

    let newView = UIView()
    newView.backgroundColor = UIColor.red
    newView.translatesAutoresizingMaskIntoConstraints = false

    self.view.addSubview(newView)


    newView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 40).isActive = true
    newView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0).isActive = true
    newView.widthAnchor.constraint(equalToConstant: 100).isActive = true
    newView.heightAnchor.constraint(equalToConstant: 100).isActive = true
}