在已被自定义视图替换的NSMenuItem上应用约束

时间:2018-11-02 22:05:47

标签: swift xcode macos cocoa

我已经在Swift / Cocoa中创建了带有自定义视图的主菜单,该主菜单替换了几个菜单项。自定义视图是从单独的NSView类/ xib文件中加载的。此自定义视图内的约束包含一个通过Interface Builder居中定位的标签,相应地:

enter image description here

菜单项的替换已完成,如下所示:

@IBOutlet weak var statusMenu: NSMenu!
@IBOutlet weak var tabviewRoom: tabviewMenuRoom!
@IBOutlet weak var stackScenes: NSStackView!
@IBOutlet weak var menuRoomsHeader: viewMenuHeaderRooms!

...

if let itemRoomsHeader = statusMenu.item(withIdentifier: "rooms_header") {
        menuRoomsHeader.title = "Rooms"
        itemRoomsHeader.view = menuRoomsHeader
        itemRoomsHeader.target = self
    }

但是,由于视图上缺少一些约束,菜单中的最终结果看起来像这样(NSView未被拉伸到菜单项的宽度):

enter image description here

我想知道如何向菜单项添加约束以使文本居中(=自定义NSView的宽度以红色显示,NSMenuItem的宽度以绿色显示)。

3 个答案:

答案 0 :(得分:1)

您似乎唯一的意图是将菜单标题放在中间,并使其放大。如果是这样,方法是使用菜单项attributedTitle

@IBOutlet weak var menuHeader: NSMenuItem!

func setMenuTitle() {

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = .center

    let textAttributes = [NSAttributedString.Key.font: NSFont.systemFont(ofSize: 32),
                          NSAttributedString.Key.paragraphStyle: paragraphStyle]

    let attString = NSAttributedString(string: "Title", attributes: textAttributes)

    menuHeader.attributedTitle = attString
}

更新:

如果这对您不起作用,并且您需要更多自定义,请看一下Apple在调整NSMenuItem中的视图大小时写的内容:

  

具有视图的菜单项会根据视图的框架自行调整大小,   以及其他菜单项的宽度。菜单项将始终为   至少与它的视图一样宽,但可能更宽。如果你想要你的   视图以自动展开以填充菜单项,然后确保其   自动调整大小的蒙版已设置NSViewWidthSizable;在这种情况下,视图的   setView:调用时的宽度将被视为最小值   视图的宽度。菜单将自动调整其包含视图的大小   更改框架大小。在跟踪过程中对视图框架的更改是   立即反映在菜单中。

答案 1 :(得分:1)

来自Views in Menu Items

  

如果您希望视图自动展开以填充菜单项,请确保其自动调整大小蒙版已设置NSViewWidthSizable。

这是“自动调整大小”控件中间的水平线。

关闭:

enter image description here

开启:

enter image description here

答案 2 :(得分:1)

确保已为容器视图禁用“将蒙版转换为约束”。然后在Interface Builder中调整视图大小时,检查布局是否符合预期。

您还可以通过以下方法在运行时查看活动约束:打开菜单,然后在Xcode中单击“调试视图层次结构”,然后在“调试导航器”中选择NSCarbonMenuWindow