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.
В экшен кнопки добавим такой код:
Здесь макрос NSMaxXEdge будет показывать наш popover вертикально сверху от вызывающего контрола или снизу (в зависимости от вертикального расположения нашего окна). Если нужно показывать слева или справа - NSMaxYEdge.
Выделим наш Popover и в инспекторе атрибутов и в Popover -> Behavior выберем Transient. Этот атрибут будет позволять popover`у удаляться если кликнуть где-то в другом месте окна приложения.
Вот что должно получится:
detachableWindowForPopover - popover который при перетаскивании может преобразовываться в окошко NSWindow. Все тоже очень просто. Добавляем в наш список объектов NSWindow. Размещаем на нем что-то, можно ту же иконку. Выделяем наш popover и связываем delegate (popover`а) с App Delegate - объектом (в списке наших объектов). Теперь в хидер файл добавим NSPopoverDelegate делегат, который позволит нам создавать окно из popove`ра.
Связываем наше добавленное окно с оутлетом, по которому мы будем обращаться к этому окну.
Добавляем в .m - файл метод detachableWindowForPopover:
В принципе все. Должно работать. При появлении popove`ра перетаскиваем его в любое место и создается наше окошко.
Принцип работы состоит в том, что popover связывает NSView с определенной позицией в окне (с позицией вызывающего контрола интерфейса на форме). NSView содержит пользовательский материал который будет виден в popover.
Начнем. У нас есть окно. Добавим на окно нашей формы кнопку, по которой мы будем вызывать наш popover.
Теперь свяжем наш 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`ра перетаскиваем его в любое место и создается наше окошко.
Чтобы popover закрылся при нажатии где нибудь на экране вне сообщения, есть вариант решения в коде. Просто добавьте в
ОтветитьУдалить- (void)awakeFromNib
эту строку:
_popover.behavior = NSPopoverBehaviorTransient;