Примените ограничения на NSMenuItem, который был заменен пользовательским представлением - PullRequest
0 голосов
/ 03 ноября 2018

Я создал главное меню в Swift / Cocoa с настраиваемыми представлениями, которое заменяет несколько пунктов меню. Пользовательские представления загружаются из отдельного файла NSView class / xib. Ограничения внутри этого пользовательского представления содержат метку с центром в Интерфейсном Разработчике, соответственно:

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 голосов
/ 03 ноября 2018

С Представления в пунктах меню :

Если вы хотите, чтобы ваше представление автоматически расширялось, чтобы заполнить пункт меню, то убедитесь, что его маска авторазмера имеет установленный NSViewWidthSizable.

Это горизонтальная линия в середине элемента управления Autoresizing.

Off:

enter image description here

On:

enter image description here

0 голосов
/ 03 ноября 2018

Убедитесь, что вы отключили «Преобразование маски в ограничения» для представления контейнера. Затем проверьте, что макет ведет себя так, как задумано, при изменении размера представления в Интерфейсном Разработчике.

Вы также можете просмотреть активные ограничения во время выполнения, открыв меню, нажав «Отладочная иерархия просмотра» в XCode и выбрав NSCarbonMenuWindow в Навигаторе отладки.

0 голосов
/ 03 ноября 2018

Похоже, ваше единственное намерение состоит в том, чтобы поместить заголовок меню посередине и увеличить его по размеру. Если это так, то вам нужно выбрать пункт меню 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: вызывается будет рассматриваться как минимум Ширина для просмотра. Меню изменится как содержащее представление изменить размер кадра. Изменения в кадре представления во время отслеживания немедленно отражается в меню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...