在Swift中使用简单的NSLayoutContraint?

时间:2016-06-15 20:06:12

标签: ios swift macos cocoa

我正在为子视图寻找一个简单的Swift解决方案,以编程方式使用NSLayoutContraint填充超级视图。它应该很容易理解。我觉得目前大多数答案都比需要的更复杂。

4 个答案:

答案 0 :(得分:1)

extension NSLayoutConstraint {

    public static func simpleConstraints( view:NSView, direction:NSString = "H", padding1:Int = 0, padding2:Int = 0 ) -> [NSLayoutConstraint] {
        view.translatesAutoresizingMaskIntoConstraints = false
        let constraint = NSLayoutConstraint.constraintsWithVisualFormat("\(direction):|-\(padding1)-[view]-\(padding2)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":view])
        return constraint
    }
}

用法:

parent.addConstraints( NSLayoutConstraint.simpleConstraints(child, direction: "H") )
parent.addConstraints( NSLayoutConstraint.simpleConstraints(child, direction: "V") )

答案 1 :(得分:1)

假设您已将translatesAutoresizingMaskIntoConstraints设置为false并添加subview作为view的子视图,则可以设置四个约束,如下所示:

NSLayoutConstraint.activateConstraints([
    subview.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor),
    subview.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor),
    subview.topAnchor.constraintEqualToAnchor(view.topAnchor),
    subview.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor)
])

或者在Swift 3中:

NSLayoutConstraint.activate([
    subview.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    subview.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    subview.topAnchor.constraint(equalTo: view.topAnchor),
    subview.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])

答案 2 :(得分:1)

这是一个使用可视格式的简单解决方案:

    subview.translatesAutoresizingMaskIntoConstraints = false
    let views = ["subview":subview]
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|[subview]|", options: [], metrics: nil, views: views))
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview]|", options: [], metrics: nil, views: views))

更简单的解决方案,根本不使用自动布局:

    subview.frame = view.bounds
    subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

答案 3 :(得分:0)

结合Rob's建议和我的NSLayoutConstraint扩展概念,我已经确定了这一点,以便有一行简单的“填充superview”命令:

extension NSLayoutConstraint {

    public static func activateConstraintsEqualToSuperview(child: NSView) {

        if ( child.superview == nil ) {
            Swift.print("NSLayoutConstraint.fillSuperview() superview of child is nil")
            return;
        }

        child.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activateConstraints( [
            child.leadingAnchor.constraintEqualToAnchor( child.superview!.leadingAnchor ),
            child.trailingAnchor.constraintEqualToAnchor( child.superview!.trailingAnchor ),
            child.topAnchor.constraintEqualToAnchor( child.superview!.topAnchor ),
            child.bottomAnchor.constraintEqualToAnchor( child.superview!.bottomAnchor )
            ])
    }
}

用法:

NSLayoutConstraint.activateConstraintsEqualToSuperview(child)