如何在Swift 3.0中使用Visual格式设置自动布局约束

问题描述 投票:0回答:1

我一直试图在swift 3中使用带有可视格式的autolayout并且它一直在崩溃。下面的代码基本上将一些UIImageView添加到滚动视图并使其可滚动。但是,当我试图向滚动视图和imageview添加约束时,应用程序不断崩溃,代码在swift 2.3上运行正常

let page1 = createAndAddViewsWith("image1", middleTextLabel: "Welcome to TwisCode")
    let page2 = createAndAddViewsWith("image2", middleTextLabel: "This is just a practice")
    let page3 = createAndAddViewsWith("image3", middleTextLabel: "And the button will appear here")


    pages = [page1, page2, page3]

    print(pages)

    let views = ["view": view, "page1": page1.view, "page2": page2.view, "page3": page3.view]
    let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|[p1.view(==view)]|", options: NSLayoutFormatOptions(rawValue:0), metrics: nil, views: views)
    NSLayoutConstraint.activate(verticalConstraints)

所以我添加垂直约束的部分是它崩溃的部分。

以下是添加页面的功能。

private func createAndAddViewsWith (_ backgroundImage: String, middleTextLabel text: String )-> ContentViewController{

    let contentVC = storyboard!.instantiateViewController(withIdentifier: "ContentViewController") as! ContentViewController
    contentVC.view.translatesAutoresizingMaskIntoConstraints = false
    contentVC.backgroundImage = UIImage(named: backgroundImage)
    contentVC.textLabel = text

    scrollView.addSubview(contentVC.view)
    addChildViewController(contentVC)
    contentVC.didMove(toParentViewController: self)

    return contentVC


}
ios swift
1个回答
2
投票

看来问题是由视图数组的类型引起的。就我而言:

var nibview: UIView!
// ...
let views = ["nib": nibView]   // Type: [String: UIView?]

对它进行强制转换以确保值不是可选的似乎可以解决它(底层将它转换为constraints.withVisualFormat期望的值)。

let views: [String: UIView] = ["nib": nibView]
let views: [String: Any] = ["nib": nibView]

或者,您可以确保您的视图数组永远不会有可选视图。 (我必须明确展开一个隐式解包的可选项,我发现它很奇怪)。

let views = ["nib": nibView!]

这篇文章是我了解原因的地方: Autolayout issue Xcode 8 [_SwiftValue nsli_superitem]

© www.soinside.com 2019 - 2024. All rights reserved.