Swift:调整嵌入式自定义 NSView 的大小

Swift: Resize Embedded Custom NSView

我有一个嵌入到 NSScrollView 中的自定义 NSView。

我已将自定义视图设置为使用不同的视图控制器。

import Cocoa

class ViewController: NSViewController
{

    @IBOutlet weak var clipView: NSClipView!
    var vc : NSViewController?

    override func viewDidLoad()
    {
        super.viewDidLoad()
        if let storyboard = NSStoryboard(name: "Main",bundle: nil)
        {
            vc = storyboard.instantiateControllerWithIdentifier("vc") as? NSViewController
            clipView.documentView = vc!.view
        }
    }
}

这一切似乎都有效,但我希望自定义视图中的视图控制器在我调整外部 window 大小时增长。

我已经设置了约束,自定义视图相应地增长,但内容显示相同的宽度。

当 window 展开时,自定义框架会更改大小,但其内容不会调整大小。例如,我希望本例中的按钮在视图中保持右对齐。

如您所见,当 window 扩展时,自定义视图的红色背景会改变大小,但按钮仍保留在其原始位置。

如何让内部视图随外部视图调整大小?

更新:已遵循以下建议。我现在添加了一个 NSScrollView 并且在所有限制条件下它都可以很好地跟随调整大小。当我删除底部约束时,它会自行折叠并底部对齐:

我想我需要指定高度并顶部对齐视图。有什么想法吗?

假设您在外部视图约束更改后对按钮进行了正确的约束,您可能需要调用 view.layoutIfNeeded() 或 button.layoutIfNeeded()

如果您在视图本身上设置背景,您可以看到它的 size/position 没有改变。

vc.view.wantsLayer = true
vc.view.layer?.backgroundColor = NSColor.blueColor().CGColor

因此您可以添加约束,告诉它填充整个剪辑视图:

vc.view.translatesAutoresizingMaskIntoConstraints = false

// these are 10.11-only APIs, but you can use the visual format language or any other autolayout APIs
vc.view.leadingAnchor.constraintEqualToAnchor(vc.view.superview!.leadingAnchor).active = true
vc.view.topAnchor.constraintEqualToAnchor(vc.view.superview!.topAnchor).active = true
vc.view.bottomAnchor.constraintEqualToAnchor(vc.view.superview!.bottomAnchor).active = true
vc.view.trailingAnchor.constraintEqualToAnchor(vc.view.superview!.trailingAnchor).active = true

但我会问,你为什么要使用滚动视图?