У нас есть popovers в Mac Cocoa приложениях?

Popovers сильно используются в iPad-приложениях, и мне они очень нравятся. Теперь я думаю о том, как это можно реализовать в AppKit на Mac, потому что у меня есть прецедент для него.

Мне нужен подкласс NSWindow для выполнения наложения или я также могу использовать обычный вид?

Ответы

Ответ 1

Если бы я понял вас правильно, вам нужно что-то вроде MAAttachedWindow (автор Matt Gemmell), который является открытым исходным кодом.

MAAttachedWindow

Ответ 2

Согласно Документация разработчика Apple, вы можете использовать встроенные popovers в OS X со встроенным классом NSPopover:

Начиная с OS X v10.7, AppKit обеспечивает поддержку popovers посредством класса NSPopover. Попсор предоставляет средства для отображения дополнительного контента, связанного с существующим контентом на экране. Представление, содержащее существующий контент, из которого возникает popover, упоминается в этом контексте как представление местоположения. Вы используете якорь, чтобы выразить связь между popover и его позиционным представлением.

Здесь ссылка на класс NSPopover. Вы также можете увидеть пример NSPopovers, используемый в приложении Calendar (10.7+), и в приложении Safari (10.8+). На изображении ниже изображен popover в приложении "Календарь" (слева) и Safari (справа):

Use of NSPopover in Mac OS X


Здесь, как настроить NSPopover, это очень просто и может быть сделано в основном в построителе интерфейса.

  • Добавьте элемент NSPopover в свой XIB в построителе интерфейса. Это создаст NSPopover и его контроллер вида.
  • Затем перетащите пользовательский NSView в свой XIB-интерфейс. Это будет представление для контроллера popover view
  • Настройте свой NSView с помощью любых элементов управления, которые вам нужны в вашем расположении.
  • В вашем файле заголовка (.h) добавьте следующие две строки кода:

    @property (assign) IBOutlet NSPopover *popover;
    - (IBAction)showPopover:(id)sender;
    

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

  • В вашей реализации синтезируйте popover и добавьте метод для showPopover
  • В методе showPopover добавьте эту строку, чтобы показать popover:

    [[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxYEdge];
    

Это вам решать, как отклонить popover; потому что какое удовольствие он копирует/вставляет? Вы можете сделать это вручную (подсказка: попробуйте использовать close) или измените свойство behavior и попросите систему (см. Ниже).

Удачи, надеюсь, это поможет!


Изменить

Как отмечено Дэвидом в его комментарии:

Другая возможность отклонения popover заключается в том, чтобы установить его поведение на Переходный. Это позволяет пользователю щелкнуть в любом месте вне popover, чтобы он исчез.

Свойство поведения popover устанавливает, как оно появляется и исчезает. Существует три типа поведения:

  • NSPopoverBehaviorApplicationDefined - (по умолчанию) Ваше приложение должно закрыть сам popover
  • NSPopoverBehaviorTransient - popover закрывается, когда какой-либо элемент интерфейса взаимодействует с внешней стороной
  • NSPopoverBehaviorSemitransient - Popover закрывается, когда какой-либо элемент интерфейса в представлении представления popover взаимодействует с внешней стороной popover.

Подробнее об этом читайте в Apple Documentation.