我已经在Swift / Cocoa中创建了带有自定义视图的主菜单,该主菜单替换了几个菜单项。自定义视图是从单独的NSView
类/ xib文件中加载的。此自定义视图内的约束包含一个通过Interface Builder居中定位的标签,相应地:
菜单项的替换已完成,如下所示:
@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
未被拉伸到菜单项的宽度):
我想知道如何向菜单项添加约束以使文本居中(=自定义NSView
的宽度以红色显示,NSMenuItem
的宽度以绿色显示)。
答案 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)
如果您希望视图自动展开以填充菜单项,请确保其自动调整大小蒙版已设置NSViewWidthSizable。
这是“自动调整大小”控件中间的水平线。
关闭:
开启:
答案 2 :(得分:1)
确保已为容器视图禁用“将蒙版转换为约束”。然后在Interface Builder中调整视图大小时,检查布局是否符合预期。
您还可以通过以下方法在运行时查看活动约束:打开菜单,然后在Xcode中单击“调试视图层次结构”,然后在“调试导航器”中选择NSCarbonMenuWindow
。