调整窗口大小以查看故事板中的控制器大小

Kau*_*eya 11 macos cocoa storyboard appkit

我正在OSX 10.10上开发Xcode 6.1.1.我正在为Mac应用程序试用故事板.我有一个使用new的NSTabViewController NSTabViewControllerTabStyleToolbar tabStyle,它被设置为窗口控制器的默认视图控制器.如何根据当前选定的视图控制器调整窗口大小?

是否可以完全在Interface Builder中完成?这是我的故事板的样子: 故事板

rou*_*ter 12

自动布局答案是它的一半.您需要在每个选项卡的ViewController中将preferredContentSize设置为拟合大小(如果您希望选项卡大小为满足所有约束的最小大小).

override func viewWillAppear() {
        super.viewWillAppear()
        preferredContentSize = view.fittingSize
}
Run Code Online (Sandbox Code Playgroud)

如果您的约束导致下面的问题首先尝试使用固定大小,下面的示例在选项卡项的视图控制器的viewWillAppear函数中设置它(此处使用Swift,但Objective-C版本也可以正常工作).

override func viewWillAppear() {
        super.viewWillAppear()
        preferredContentSize = NSSize(width: 400, height: 280)
}
Run Code Online (Sandbox Code Playgroud)

如果可行,请调整您的约束以弄清楚发生了什么

  • 这有效,但我没有动画视图高度变化.当选择相关选项卡时,它仅使用新大小重绘自身.有没有什么技巧可以支持动画高度变化? (3认同)

Ely*_*Ely 8

“工具栏样式”选项卡视图控制器的此解决方案确实具有动画效果并支持漂亮的淡入淡出效果。在故事板设计器中,在 NSTabViewController 的自定义类名字段中添加“TabViewController”。不要忘记为每个 viewController 分配一个标题,这用作键值。

import Cocoa

class TabViewController: NSTabViewController {

    private lazy var tabViewSizes: [String : NSSize] = [:]

    override func viewDidLoad() {
        // Add size of first tab to tabViewSizes
        if let viewController = self.tabViewItems.first?.viewController, let title = viewController.title {
            tabViewSizes[title] = viewController.view.frame.size
        }
        super.viewDidLoad()
    }

    override func transition(from fromViewController: NSViewController, to toViewController: NSViewController, options: NSViewController.TransitionOptions, completionHandler completion: (() -> Void)?) {

        NSAnimationContext.runAnimationGroup({ context in
            context.duration = 0.5
            self.updateWindowFrameAnimated(viewController: toViewController)
            super.transition(from: fromViewController, to: toViewController, options: [.crossfade, .allowUserInteraction], completionHandler: completion)
        }, completionHandler: nil)
    }

    func updateWindowFrameAnimated(viewController: NSViewController) {

        guard let title = viewController.title, let window = view.window else {
            return
        }

        let contentSize: NSSize

        if tabViewSizes.keys.contains(title) {
            contentSize = tabViewSizes[title]!
        }
        else {
            contentSize = viewController.view.frame.size
            tabViewSizes[title] = contentSize
        }

        let newWindowSize = window.frameRect(forContentRect: NSRect(origin: NSPoint.zero, size: contentSize)).size

        var frame = window.frame
        frame.origin.y += frame.height
        frame.origin.y -= newWindowSize.height
        frame.size = newWindowSize
        window.animator().setFrame(frame, display: false)
    }
}
Run Code Online (Sandbox Code Playgroud)