视觉约束无法识别

时间:2016-04-21 05:01:25

标签: ios swift uiwebview autolayout

我只是想设置允许.填充屏幕的约束。 (屏幕有一个UIWebView和一个UINavigationbar),我试过按照苹果文档中给出的示例,但总是收到警告,我的视图没有显示出来。以下是我的尝试。

UIToolBar

2 个答案:

答案 0 :(得分:0)

Oofh,视觉上的限制使我的头部受伤。我从来不是视觉语言的粉丝,从来没有对我有任何意义。这可能是更多的代码,但我认为作为开发人员阅读更容易,而且意图更具表现力。

self.view.addSubview(webView)
self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: .Left, relatedBy: .Equal, toItem: webView, attribute: .Left, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: .Top, relatedBy: .Equal, toItem: webView, attribute: .Top, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: .Bottom, relatedBy: .Equal, toItem: webView, attribute: .Bottom, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: .Right, relatedBy: .Equal, toItem: webView, attribute: .Right, multiplier: 1, constant: 0))

这些约束将视图的所有边缘固定到距离为0的相应边缘。

然后在约束结束时,不要忘记:

self.view.layoutIfNeeded()

我对视觉语言的问题是我无法看到它并立即清楚它的作用。在这里,它非常明确。只是为了好玩,这里有一个很好的功能,只要你的常数和乘数是0,你就可以使用它:

/**
 Adds an edge constraint between the superview and subview with a constant of 0.

 - parameter attribute: Layout attribute.
 - parameter subview:   Subview.
 */
func addEdgeConstraintWithAttribute(attribute: NSLayoutAttribute, withSubview subview: UIView) {
    self.addConstraint(NSLayoutConstraint(item: subview, attribute: attribute, relatedBy: .Equal, toItem: self, attribute: attribute, multiplier: 1, constant: 0))
}

用过:

self.addEdgeConstraint(.Top, withSubview: webView)

其中该函数是UIView

上的扩展名

答案 1 :(得分:0)

我的意见是,你的观点并没有显示出来,因为你没有为它设置足够的限制。

基本上,对于视图,您应该添加约束以让它至少知道位置和大小。在某些情况下,您不需要设置大小限制,因为该视图的intrinsic content size类似UILabelUIButton

回到你的例子,你应该添加这样的约束:

private func addSubviews(){
    navigationController?.setToolbarHidden(false, animated: false)
    //        webView = UIWebView(frame: CGRect(x: 0, y: 0, width: UIScreen.mainScreen().bounds.width, height: UIScreen.mainScreen().bounds.height))

    let webView = UIWebView(frame: CGRectZero)
    webView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(webView)
    let views = ["myView" : webView]
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[myView]-|", options:[] , metrics: nil, views: views))
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[myView]-|", options:[] , metrics: nil, views: views))
}
H中的

H:|-[myView]-|代表横向。

V中的

V:|-[myView]-|代表垂直。