我有一个NSView的Subview(比如NSView),里面有NSTextField。
注意:此代码基于此github.repo
MainView指定了初始化程序如下
init(title : String, layout :NSLayoutAttribute) {
innerView = self.createTextField(title)//Text field with stringValue = title
mainView.addSubview(innerView)
createViewConstrants(innerView, layout: layout)
}布局可以是Left、Right或CenterX。
(内部TextView总是垂直中心,只有水平对齐可以改变)
下面的函数为这个目的设置约束
func createViewConstrants(view : NSView, layout :NSLayoutAttribute) {
let viewMap = ["innerView" : view, "superview" : mainView]
var constraints :[AnyObject]!
switch layout {
case .Left:
println("Left")
constraints = NSLayoutConstraint.constraintsWithVisualFormat(
"H:[superview]-(<=1)-[innerView]",
options: NSLayoutFormatOptions.AlignAllCenterY,
metrics: nil,
views: viewMap)
mainView.addConstraints(constraints)
case .Right:
println("Right")
constraints = NSLayoutConstraint.constraintsWithVisualFormat(
"H:[superview]-(<=1)-[innerView]-|",
options: NSLayoutFormatOptions.AlignAllCenterY,
metrics: nil,
views: viewMap)
mainView.addConstraints(constraints)
case .CenterX:
println("Center")
constraints = NSLayoutConstraint.constraintsWithVisualFormat(
"V:[superview]-(<=1)-[innerView]",
options: NSLayoutFormatOptions.AlignAllCenterX,
metrics: nil,
views: viewMap)
mainView.addConstraints(constraints)
constraints = NSLayoutConstraint.constraintsWithVisualFormat(
"H:[superview]-(<=1)-[innerView]",
options: NSLayoutFormatOptions.AlignAllCenterY,
metrics: nil,
views: viewMap)
mainView.addConstraints(constraints)
default:
fatalError("Invalid layout")
}
}Right和Center运行良好,但left不起作用。
此外,由于垂直对中是常见的所有情况,它能被从开关箱中取出来吗?
发布于 2015-04-11 14:49:24
若干问题:
|)字符。这是:
超视图-(<=1)-innerView
这并不意味着innerView的领先优势在“超级视图的领先优势”之后不到1分,它意味着innerView的领先优势在超级视图的落后边缘之后还不到1分,这可能会使innerView超出其superview的界限,从而导致其被裁剪。innerView的约束,那么您的布局是不明确的。不平等允许任何可能的值,而系统没有可靠的方法来选择其中一个值而不是其他值。constraintsWithVisualFormat(_:options:metrics:views:) (正如您所知道的那样),但是( a)这实际上不是视觉格式语言的一部分,而b)如果不在另一个方向上创建一些虚假的、不必要的约束,您就无法做到这一点。也就是说,除非您还创建了一些虚假的水平约束,否则不能使用对齐标志来垂直地居中。(反之亦然)这是因为对齐标志只适用于VFL字符串中列出的视图,而VFL字符串始终意味着约束。init(item:attribute:relatedBy:toItem:attribute:multiplier:constant:),则可以简单地传递方法接收的layout参数。不需要有多个案例的switch。你只需要做:
变量约束=NSLayoutConstraint(项目: innerView,属性:布局,relatedBy:.Equal,toItem: mainView,属性:布局乘数: 1,常数: 0) mainView.addConstraint(约束)约束=NSLayoutConstraint(项目: innerView,属性:.CenterY,relatedBy:.Equal,toItem: mainView,属性:.CenterY乘数: 1,常数: 0) mainView.addConstraint(约束)
可以处理所有三起案件。https://stackoverflow.com/questions/29577705
复制相似问题