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
但我会问,你为什么要使用滚动视图?
我有一个嵌入到 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
但我会问,你为什么要使用滚动视图?