【问题标题】:Swift: Resize Embedded Custom NSViewSwift:调整嵌入式自定义 NSView 的大小
【发布时间】:2015-10-17 00:10:53
【问题描述】:

我有一个嵌入在 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
        }
    }
}

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

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

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

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

如何让内部视图与外部视图一起调整大小?

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

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

【问题讨论】:

    标签: macos swift nsview


    【解决方案1】:

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

    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
    

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

    【讨论】:

    • 这是对我的问题的一个很好的回答,几乎正是我想要的。你问我为什么使用滚动视图是对的。实际上,我有几张表格要垂直展示。我试图让视图水平增长,同时保持垂直滚动。使用上面的代码显然会将所有视图内容压缩到屏幕中。如何保持垂直高度?谢谢
    • @iphaaw 您应该能够简单地省略底部约束。滚动/剪辑视图旨在处理大于其边界的文档视图。
    • 我已遵循以下建议。我现在添加了一个 NSScrollView 并且所有约束都很好地遵循了调整大小。当我删除底部约束时,它会自行折叠并底部对齐:请参阅图片的更新问题。我想我需要指定一个高度并顶部对齐视图。有什么建议?谢谢
    • 我不确定,但我怀疑您应该能够指定 align-top-to-superview 约束,并且没有底部约束。假设它的子视图被正确约束,视图的自动 contentHugging 约束应该使它增长到必要的高度。 (由于 NSClipView 可能会涉及一些额外的技巧。)但是,如果您只是显示数据,为什么不使用为此设计的东西,例如 NSTableView?
    • 感谢您的帮助。你的回答非常好,你肯定赢得了赏金。我还有最后一个问题要解决:我正在使用 3-4 个 NSTableView,每个都嵌入到自己的 NSScrollView 中,而这些 NSTableView 又嵌入到主 NSScrollView 中。主 NSScrollView 是我想要在上面工作的。他们自己崩溃了,所以我想我只需要设置 TableView 的 NSScrollViews 的高度,我应该很接近。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2021-05-16
      • 1970-01-01
      相关资源
      最近更新 更多