Ответ 1
Если бы я понял вас правильно, вам нужно что-то вроде MAAttachedWindow (автор Matt Gemmell), который является открытым исходным кодом.
Popovers сильно используются в iPad-приложениях, и мне они очень нравятся. Теперь я думаю о том, как это можно реализовать в AppKit на Mac, потому что у меня есть прецедент для него.
Мне нужен подкласс NSWindow для выполнения наложения или я также могу использовать обычный вид?
Если бы я понял вас правильно, вам нужно что-то вроде MAAttachedWindow (автор Matt Gemmell), который является открытым исходным кодом.
Согласно Документация разработчика Apple, вы можете использовать встроенные popovers в OS X со встроенным классом NSPopover:
Начиная с OS X v10.7, AppKit обеспечивает поддержку popovers посредством класса NSPopover. Попсор предоставляет средства для отображения дополнительного контента, связанного с существующим контентом на экране. Представление, содержащее существующий контент, из которого возникает popover, упоминается в этом контексте как представление местоположения. Вы используете якорь, чтобы выразить связь между popover и его позиционным представлением.
Здесь ссылка на класс NSPopover. Вы также можете увидеть пример NSPopovers, используемый в приложении Calendar (10.7+), и в приложении Safari (10.8+). На изображении ниже изображен popover в приложении "Календарь" (слева) и Safari (справа):
Здесь, как настроить NSPopover, это очень просто и может быть сделано в основном в построителе интерфейса.
В вашем файле заголовка (.h) добавьте следующие две строки кода:
@property (assign) IBOutlet NSPopover *popover;
- (IBAction)showPopover:(id)sender;
Не забудьте подключить как выход, так и действие к вашему интерфейсу.
showPopover
В методе showPopover
добавьте эту строку, чтобы показать popover:
[[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxYEdge];
Это вам решать, как отклонить popover; потому что какое удовольствие он копирует/вставляет? Вы можете сделать это вручную (подсказка: попробуйте использовать close
) или измените свойство behavior
и попросите систему (см. Ниже).
Удачи, надеюсь, это поможет!
Изменить
Как отмечено Дэвидом в его комментарии:
Другая возможность отклонения popover заключается в том, чтобы установить его поведение на Переходный. Это позволяет пользователю щелкнуть в любом месте вне popover, чтобы он исчез.
Свойство поведения popover устанавливает, как оно появляется и исчезает. Существует три типа поведения:
NSPopoverBehaviorApplicationDefined
- (по умолчанию) Ваше приложение должно закрыть сам popoverNSPopoverBehaviorTransient
- popover закрывается, когда какой-либо элемент интерфейса взаимодействует с внешней сторонойNSPopoverBehaviorSemitransient
- Popover закрывается, когда какой-либо элемент интерфейса в представлении представления popover взаимодействует с внешней стороной popover.Подробнее об этом читайте в Apple Documentation.
В качестве альтернативы вы можете посмотреть пример Popover
в документации. https://developer.apple.com/library/mac/samplecode/Popover/Introduction/Intro.html