【问题标题】:Locking the Aspect Ratio of an NSDocument's window锁定 NSDocument 窗口的纵横比
【发布时间】:2011-09-06 18:50:25
【问题描述】:

我有一个基于文档的应用程序,我正在尝试锁定文档窗口的纵横比。文档的内容是一个自定义视图,我可以轻松设置纵横比。但是,当我调整窗口大小时,有一个黑色背景填充了视图和窗口之间的空间。我已经尝试在我的文档类中覆盖窗口的 aspectRatio 但这似乎并没有奏效。

- (NSSize)aspectRatio {
    return NSMakeSize(600,480);
}

我还尝试在加载笔尖后设置 Windows 纵横比。当我的应用程序不基于文档时,这起到了作用。

[window setAspectRatio:window.frame.size];

我还有一个踢脚线...假设我可以锁定窗口的纵横比,我想在用户单击缩放按钮以将应用程序置于全屏时覆盖它。只有这样,我才会想要填充视图和窗口之间的空间。

我已经研究了很长时间,但找不到解决方案。

【问题讨论】:

    标签: cocoa nswindow appkit


    【解决方案1】:

    有一个黑色背景填充了视图和窗口之间的空间

    你不能把窗口背景设置成不同的颜色吗?

    我尝试在我的文档类中覆盖窗口的 aspectRatio

    NSDocument 的子类中?如果覆盖-aspectRatio 有效,它应该在NSWindow 的子类中。但是,您应该使用-setAspectRatio:

    我还尝试在加载笔尖后设置 Windows 纵横比。当我的应用不基于文档时,这可以解决问题。

    无论窗口属于基于文档还是非基于文档的应用程序,这都有效。

    当用户单击缩放按钮以将应用程序置于全屏状态时,我想覆盖它

    您可以拥有一个实现–windowShouldZoom:toFrame: 的窗口委托,它是NSWindowDelegate 协议的一部分。


    由于 OP 正在开发一个基于文档的应用程序,没有 NSWindowNSWindowController 的自定义子类,因此实现:

    - (void)windowControllerDidLoadNib:(NSWindowController *)aController
    {
        [super windowControllerDidLoadNib:aController];
        [[aController window] setAspectRatio:(NSSize){600,400}];
    }
    

    NSDocument 子类中的唯一更改是根据 Xcode 中基于文档的应用程序模板设置项目的纵横比。

    一般来说,我建议不要使用负责窗口和文档的 NSDocument 子类。在我看来,更好的设计是让NSDocument 子类只处理文档,并创建一个NSWindowController 的子类只处理窗口——想想functional cohesionsingle responsibility principle

    【讨论】:

    • @Bavarious:我不相信您认为窗口大小必须是整数倍是正确的。我已经完成了[window setAspectRatio:[window frame].size];(现在只是仔细检查了)并且没有调整大小的问题。
    • @Josh True;文档可能有点误导。
    • 是的。我的类是 NSDocument 的子类。我不能继承 NSWindow,否则我会破坏 NSDocument 提供给我的各种其他东西。我确实尝试过使用-setAspectRatio:,但是它似乎对我不起作用。
    • 我的类可以是 NSDocument 和 NSWindow 的子类吗?
    • @Joe 如何获得对文档窗口的NSWindow * 引用?不,一个类最多有一个(直接)超类。
    猜你喜欢
    • 2022-11-15
    • 2018-06-11
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多