首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NSView对齐NSView内的VFL

用NSView对齐NSView内的VFL
EN

Stack Overflow用户
提问于 2015-04-11 12:09:39
回答 1查看 739关注 0票数 1

我有一个NSView的Subview(比如NSView),里面有NSTextField。

注意:此代码基于此github.repo

MainView指定了初始化程序如下

代码语言:javascript
复制
init(title : String, layout :NSLayoutAttribute) {
    innerView = self.createTextField(title)//Text field with stringValue = title
    mainView.addSubview(innerView)
    createViewConstrants(innerView, layout: layout)
}

布局可以是LeftRightCenterX

(内部TextView总是垂直中心,只有水平对齐可以改变)

下面的函数为这个目的设置约束

代码语言:javascript
复制
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")

    }
}

RightCenter运行良好,但left不起作用。

此外,由于垂直对中是常见的所有情况,它能被从开关箱中取出来吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-11 14:49:24

若干问题:

  1. 您通常不会在VFL中显式地列出superview。相反,您使用垂直行(|)字符。这是: 超视图-(<=1)-innerView 这并不意味着innerView的领先优势在“超级视图的领先优势”之后不到1分,它意味着innerView的领先优势在超级视图的落后边缘之后还不到1分,这可能会使innerView超出其superview的界限,从而导致其被裁剪。
  2. 如果这些是您要添加的唯一影响innerView的约束,那么您的布局是不明确的。不平等允许任何可能的值,而系统没有可靠的方法来选择其中一个值而不是其他值。
  3. 你真的不能在VFL中表达居中的意思。您可以将对齐标志传递给constraintsWithVisualFormat(_:options:metrics:views:) (正如您所知道的那样),但是( a)这实际上不是视觉格式语言的一部分,而b)如果不在另一个方向上创建一些虚假的、不必要的约束,您就无法做到这一点。也就是说,除非您还创建了一些虚假的水平约束,否则不能使用对齐标志来垂直地居中。(反之亦然)这是因为对齐标志只适用于VFL字符串中列出的视图,而VFL字符串始终意味着约束。
  4. 你为什么坚持使用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(约束) 可以处理所有三起案件。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29577705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档