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