【问题标题】:How to change the height of an NSWindow titlebar?如何更改 NSWindow 标题栏的高度?
【发布时间】:2011-06-06 01:39:24
【问题描述】:

我想改变一个 NSWindow 标题栏的高度。

这里有一些例子:

还有……

我可以使用 NSToolbar,但问题是我不能将视图放置得很高(例如:我不能将 segmentedControl 放置在高于图片中的位置,因为还有标题栏)

如果我删除标题栏,我将无法放置 NSToolbar 并且窗口不可移动。

你有什么想法吗?

【问题讨论】:

    标签: cocoa macos nswindow


    【解决方案1】:

    这比人们想象的要容易得多。我也一直在寻求为我的应用做类似的事情。

    真正的 App Store 应用程序:

    我的 App Store 应用外观相似:

    不尊重 INAppStoreWindow,它是一个非常好的实现和可靠的。不过,我从中看到的唯一缺点是有很多绘图代码以及 Apple 可以随时调整的 TitleBar 颜色的硬编码设置。

    这就是我的做法:

    A) 创建一个标准窗口,其中设置了标题栏、关闭、最小化、阴影、调整大小、全屏 - 主窗口。 注意:您不需要纹理窗口,也不应该设置标题

    B) 接下来添加具有这些设置的标准工具栏:

    • 仅图标
    • 在发布时可见 - 开启
    • 可自定义 - 关闭
    • 分隔符 - 开启
    • 尺寸 - 常规

    删除所有工具栏项并按以下顺序仅添加这些项

    NSSegmentControl (51 x 24) -- |灵活空间 | -- NSSearchField (150 x 25)

    C) 在您的内容视图中,直接在工具栏下方添加一个常规大小的 NSButton 集,如下所示:

    • 有边框 - 关闭
    • 透明 - 关闭
    • 标题 -
    • 图片 -
    • 位置 - 按钮下方的文字
    • 字体 - System Small 11

    好的,到目前为止很容易,对吧?!

    在您的窗口控制器或应用程序委托中...... 设置 IBOutlet(s) 到你的 NSButton(s)

    注意:记得在界面生成器中连接你的 IBOutlet

    好吧,别害怕,我们现在必须编写一点代码:

    在 awakeFromNib 或 windowDidLoad....

    1. 获取内容视图的超级视图(又名 NSThemeView)
    2. 从超级视图中删除您的按钮
    3. 设置按钮的框架
    4. 将按钮添加回主题视图

    所以代码看起来类似于:

    NSView *themeView = [self.contentView superview];
    NSUInteger adj = 6;
    
    [self.btnFeatured removeFromSuperview];
    self.btnFeatured.frame = NSMakeRect( self.btnFeatured.frame.origin.x,
                                  self.window.frame.size.height - self.btnFeatured.frame.size.height - adj,
                                  self.btnFeatured.frame.size.width, self.btnFeatured.frame.size.height);
    [themeView addSubview:self.btnFeatured];
    

    就是这样!您可以使用您的插座来启用/禁用您的按钮,在选择时设置蒙版图像,启用/禁用工具栏,甚至隐藏所有内容并添加窗口标题。如果 Apple 更改其标准窗口标题栏,所有这一切都无需担心。

    附:这篇文章中没有使用任何私有框架!

    【讨论】:

    • 这很好用,但我怎样才能使用自动布局来实现呢?
    • 基本上,我所做的只是关闭了包含标题栏视图的主窗口 XIB 文件的自动布局。包含在其自己的 XIB 中的每个其他视图都使用自动布局。希望这会有所帮助。
    • 太棒了!!,我是 Objective-C 的新手,我还没有意识到我可以为每个 NIB 文件使用自动布局选项。
    • 欢迎来到 Objective-C!尽管自动布局在绘图曲线上减少了很多,但它有一个学习曲线。它也没有完全出炉,这意味着您会发现 Lion 和 Mountain Lion 之间的差异以及使用 NSTableView / NSScrollView 时的“未记录”问题。祝你好运...
    • 这在你将窗口设为全屏时不起作用。
    【解决方案2】:

    INAppStoreWindow 是一个 NSWindow 子类,它告诉你如何改变标题栏的高度。

    https://github.com/indragiek/INAppStoreWindow

    http://iloveco.de/adding-a-titlebar-accessory-view-to-a-window/
    这个例子告诉你如何在标题栏中添加按钮。

    【讨论】:

    • INAppStoreWindow 类无法正常工作。 github上的当前项目无法编译。
    • @MatterGoal 我尝试了 INAppStoreWindow 项目。没关系。你能再试一次吗?
    【解决方案3】:

    您必须继承 NSWindow 并进行自定义窗口框架绘图。这不仅仅是关于标题栏。它是关于整个窗口框架(实际上,如果您愿意,您可以在底部放置关闭/最小化/缩放按钮)。

    "Cocoa with love" website 是一个不错的起点。

    【讨论】:

      【解决方案4】:

      有一些基于 INAppStoreWindow 的新解决方案,并且没有警告和日志消息,适用于任何想要更改 NStitlebar 高度、更改交通灯位置、在 NStitlebar 上添加项目(例如 NSbutton)并更改其位置,请在下面查看。

      方式窗口: https://github.com/weAreYeah/WAYWindow

      NStitlebar_with_item: https://github.com/ZHANGneuro/NStitlebar_with_item

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-03
        • 2017-10-24
        • 2023-03-11
        • 2013-11-29
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 2012-09-25
        相关资源
        最近更新 更多