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

Можно установить представление для использования пункта меню NSMenuItem setView: метод (по умолчанию, пункт меню имеет a nil представление) — отмечают, тем не менее, что представления пункта меню не поддерживаются в меню Dock. Следующий фрагмент кода иллюстрирует, как можно создать новое меню и добавить его к строке меню приложения

NSMenuItem* menuBarItem = [[NSMenuItem alloc]
                        initWithTitle:@"Custom" action:NULL keyEquivalent:@""];
// title localization is omitted for compactness
NSMenu* newMenu = [[NSMenu alloc] initWithTitle:@"Custom"];
[menuBarItem setSubmenu:newMenu];
[[NSApp mainMenu] insertItem:menuBarItem atIndex:3];
 
/*
 Assume that myView1 and myView2 are existing view objects;
 for example, you may have created them in a NIB file.
 */
NSMenuItem* newItem;
newItem = [[NSMenuItem alloc]
               initWithTitle:@"Custom Item 1"
               action:@selector(menuItem1Action:)
               keyEquivalent:@""];
[newItem setView: myView1];
[newItem setTarget:self];
[newMenu addItem:newItem];
 
newItem = [[NSMenuItem alloc]
               initWithTitle:@"Custom Item 2"
               action:@selector(menuItem2Action:)
               keyEquivalent:@""];
[newItem setView: myView2];
[newItem setTarget:self];
[newMenu addItem:newItem];

Пункт меню с целью не составляет свой заголовок, состояние, шрифт или другие стандартные атрибуты получения, и возлагает ответственность за получение полностью на представление. Эквиваленты клавиатуры и выбор типа продолжают использовать ключевой эквивалент и заголовок как нормальные.

Представление в пункте меню может получить все события от нажатия мыши, поскольку не поддерживаются нормальные, но события клавиатуры. Во время «нелипкого» отслеживания меню (т.е. управляя меню с удерживаемой кнопкой мыши), представление в пункте меню получает mouseDragged: события.

Можно добавить анимацию к представлению пункта меню, поскольку Вы были бы любое другое представление (Вы устанавливаете таймер для вызова setNeedsDisplay: или display), но потому что отслеживание меню происходит в NSEventTrackingRunLoopMode, необходимо добавить таймер к циклу выполнения в том режиме.

Когда меню открыто, представление добавляется к окну; когда меню закрывается, представление удалено из окна. При использовании пользовательского представления можно поэтому переопределить viewDidMoveToWindow как удобное место, чтобы запуститься или остановить анимацию, сбросьте прямоугольники отслеживания и т.д., но Вы не должны пытаться переместить или иначе изменить окно

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

Когда пункт меню копируется с помощью NSCopying, любое присоединенное представление копируется с помощью архивации и разархивирования.