1、基础创建

1.1 代码

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

NSButton *button = [[NSButton alloc] init];
button.frame = NSMakeRect(150, 100, 60, 40);
[self.window.contentView addSubview:button];
// 添加点击事件
button.target = self;
button.action = @selector(button_Tap:);
}

- (void)button_Tap:(NSButton *)button {
self.pop_on = !self.pop_on;
if (self.pop_on) {
// 具体参考坐标是多少,具体显示在哪里
// NSRectEdgeMinY :显示在button 上面
[self.gc_popover showRelativeToRect:[button bounds] ofView:button preferredEdge:NSRectEdgeMinX];
}
else {
// 主动关闭显示
[self.gc_popover close];
}

NSLog(@"popover是否在显示 == %@", @(self.gc_popover.isShown));
}

// 懒加载 popover
- (NSPopover *)gc_popover {
if(!_gc_popover) {
// 创建
_gc_popover = [[NSPopover alloc] init];
// 设置内容控制器
_gc_popover.contentViewController = self.gc_controller;
// popover的弹出收回管理方式,默认 NSPopoverBehaviorApplicationDefined,即点击空白处不会自动收回
_gc_popover.behavior = NSPopoverBehaviorSemitransient;
// 内容显示大小
_gc_popover.contentSize = NSMakeSize(200, 150);
// 设置外观 */
_gc_popover.appearance = [NSAppearance appearanceNamed:NSAppearanceNameVibrantDark];
// 是否需要弹出过渡动画
_gc_popover.animates = YES;
}
return _gc_popover;
}

// 懒加载 内容控制器
- (Popover_Controller *)gc_controller {
if(!_gc_controller) {
_gc_controller = [[Popover_Controller alloc] init];
}
return _gc_controller;
}
  • 效果
  • Mac开发_NSPopover_懒加载

1.2 其他注意事项代码

  • 纯代码创建
  • Popover_Controller.h
#import <Cocoa/Cocoa.h>

NS_ASSUME_NONNULL_BEGIN

@interface Popover_Controller : NSViewController

@end

NS_ASSUME_NONNULL_END
  • Popover_Controller.m
#import "Popover_Controller.h"

@interface Popover_Controller ()

@end

@implementation Popover_Controller

// 这个一定要写,否则无法显示出来
- (void)loadView {
NSRect frame = [[[NSApplication sharedApplication] mainWindow] frame];
self.view = [[NSView alloc] initWithFrame:frame];
}

- (void)viewDidLoad {
[super viewDidLoad];

self.view.wantsLayer = YES;
self.view.layer.backgroundColor = [NSColor blueColor].CGColor;
}

@end


作者: CH520