如何在 Swift 中制作没有 VisualFormat 的约束对象?

Posted

技术标签:

【中文标题】如何在 Swift 中制作没有 VisualFormat 的约束对象?【英文标题】:How to make constraint objects without VisualFormat in Swift? 【发布时间】:2014-11-06 04:18:44 【问题描述】:

我手动添加了一堆用于纵向模式的布局约束。现在我想做两组约束,并根据设备是横向还是纵向模式在它们之间翻转。我不想使用“视觉格式化”。

我的现有/工作约束如下所示:

mainview.addConstraint( NSLayoutConstraint(item: vPic, attribute: .Top,    relatedBy: .Equal, toItem: mainview, attribute: .Top,   multiplier: 1, constant: 0) )

但我想将约束放入一个数组(以及其他数组),并在设备旋转时应用它们:

var constraintsPortrait = [NSLayoutConstraint]()

constraintsPortrait.extend(NSLayoutConstraint(item: vPic, attribute: .Top,    relatedBy: .Equal, toItem: mainview, attribute: .Top,   multiplier: 1, constant: 0))

mainview.addConstraints(constraintsPortrait)

我在第二行得到一个错误:

Type 'NSLayoutConstraint' does not conform to protocol 'SequenceType'

我可以在网上找到的唯一示例是关于如何使用“visualformat”语法将约束创建为对象。像这样:

let view2_constraint_V:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("V:[view2(>=40)]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary)

有什么建议吗?

【问题讨论】:

这是因为extend 不是append。它们押韵,但不一样。您的问题与如何制作 NSLayoutConstraints 无关。 【参考方案1】:

extend 是将Array(或任意SequenceType)连接到Array。你应该改用append

var constraintsPortrait = [NSLayoutConstraint]()
constraintsPortrait.append(NSLayoutConstraint(item: vPic, attribute: .Top, relatedBy: .Equal, toItem: mainview, attribute: .Top, multiplier: 1, constant: 0))
mainview.addConstraints(constraintsPortrait)

但在您的情况下,您不必为此准备一个数组。您可以直接使用addConstraint 方法添加约束。

mainview.addConstraint(NSLayoutConstraint(item: vPic, attribute: .Top, relatedBy: .Equal, toItem: mainview, attribute: .Top, multiplier: 1, constant: 0))

【讨论】:

【参考方案2】:

在代码中添加约束很痛苦。那里有第三方库,可以让这个过程不那么痛苦。这里是其中的一些。

Snappy cartography purelayout

【讨论】:

以上是关于如何在 Swift 中制作没有 VisualFormat 的约束对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift 3中制作多色标签栏

如何在UITableView - Swift中制作清单?

如何在 Swift 中制作一个单词可点击的 UITextView?

如何使用 Swift 制作水平 UICollectionView

如何制作多页 Swift Playground

你将如何保护用 Swift 制作的 iPhone 应用程序中的文本?