23 мар. 2014 г.

NSPopover и detachableWindowForPopover пример

NSPopover является анимированный всплывающий компонент, который показывает загруженные файлы в вэб-браузере Safari. Такой компонент был добавлен ​​в Mac OS X Lion. Если вы когда-нибудь задумывались, как добавить его в код, то это очень просто.

Принцип работы состоит в том, что popover связывает NSView с определенной позицией в окне (с позицией вызывающего контрола интерфейса на форме). NSView содержит пользовательский материал который будет виден в popover.

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


Также добавим NSView, на котором разместим иконку (также можно любой контрол, будь-то кнопку или текстовое сообщение).


Найдем в списке библиотеки объектов Popover и перетянем в наш список объектов (вместе с Popover автоматически будет перетянут и Popover View Controller).

Теперь свяжем наш NSView с Popover View Controller и выберем оутлет view.
Также создадим для кнопки экшен, из которой будет вызываться popover.

- (IBAction)showPopOver:(id)sender;

И создадим связку нашего Popover (в списке наших объектов) с оутлетом *popover.


@property (assign) IBOutlet NSPopover *popover;


В экшен кнопки добавим такой код:


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


Здесь макрос NSMaxXEdge будет показывать наш popover вертикально сверху от вызывающего контрола или снизу (в зависимости от вертикального расположения нашего окна). Если нужно показывать слева или справа - NSMaxYEdge.

Выделим наш Popover и в инспекторе атрибутов и в Popover -> Behavior выберем Transient. Этот атрибут будет позволять popover`у удаляться если кликнуть где-то в другом месте окна приложения.



Вот что должно получится:
detachableWindowForPopover - popover который при перетаскивании может преобразовываться в окошко NSWindow. Все тоже очень просто. Добавляем в наш список объектов NSWindow. Размещаем на нем что-то, можно ту же иконку.  Выделяем наш popover и связываем delegate (popover`а) с App Delegate - объектом (в списке наших объектов). Теперь в хидер файл добавим NSPopoverDelegate делегат, который позволит нам создавать окно из popove`ра.


#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, NSPopoverDelegate>


Связываем наше добавленное окно с оутлетом, по которому мы будем обращаться к этому окну.


@property (unsafe_unretained) IBOutlet NSWindow *popWindow;


Добавляем в .m - файл метод detachableWindowForPopover:


- (NSWindow *) detachableWindowForPopover:(NSPopover *)popover {
    
    return [self popWindow];
}


В принципе все. Должно работать. При появлении popove`ра перетаскиваем его в любое место и создается наше окошко.


1 комментарий:

  1. Чтобы popover закрылся при нажатии где нибудь на экране вне сообщения, есть вариант решения в коде. Просто добавьте в
    - (void)awakeFromNib

    эту строку:
    _popover.behavior = NSPopoverBehaviorTransient;

    ОтветитьУдалить