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

时间:2015-07-26 22:04:48

标签: macos swift 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
        }
    }
}

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

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

enter image description here

展开窗口时,自定义框架会更改大小,但其内容不会调整大小。例如,我喜欢这种情况下的按钮在视图中保持右对齐。

enter image description here

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

如何使用外部视图调整内部视图?

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

enter image description here

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

2 个答案:

答案 0 :(得分:1)

如果在视图本身上设置背景,则可以看到其大小/位置不会改变。

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

example

所以你可以添加约束来告诉它填充整个剪辑视图:

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

fixed version

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

答案 1 :(得分:0)

假设在外部视图约束发生更改后您在按钮中有正确的约束,则可能需要调用view.layoutIfNeeded()或button.layoutIfNeeded()