我一直试图在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
}
看来问题是由视图数组的类型引起的。就我而言:
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]