有没有办法给 NSPopover 上色?我见过像 facetab 这样的应用程序有很酷的颜色和可调整大小的弹出框,这是怎么做的?
Ay 指南,提示?
谢谢。
有没有办法给 NSPopover 上色?我见过像 facetab 这样的应用程序有很酷的颜色和可调整大小的弹出框,这是怎么做的?
Ay 指南,提示?
谢谢。
设置popover.contentViewController.view
为NSView
具有自定义背景绘图的子类(即覆盖drawRect:
并用您的自定义背景颜色填充矩形)。
然后设置popover.appearance = NSPopoverAppearanceHUD
删除视图周围的默认边框。
请注意,视图周围仍然会有一个非常细的边框,因此如果您想完全删除它,您可能需要使用MAAttachedWindow或类似的解决方案。
在 Swift 4 中:
import Cocoa
class PopoverContentView:NSView {
var backgroundView:PopoverBackgroundView?
override func viewDidMoveToWindow() {
super.viewDidMoveToWindow()
if let frameView = self.window?.contentView?.superview {
if backgroundView == nil {
backgroundView = PopoverBackgroundView(frame: frameView.bounds)
backgroundView!.autoresizingMask = NSView.AutoresizingMask([.width, .height]);
frameView.addSubview(backgroundView!, positioned: NSWindow.OrderingMode.below, relativeTo: frameView)
}
}
}
}
class PopoverBackgroundView:NSView {
override func draw(_ dirtyRect: NSRect) {
NSColor.green.set()
self.bounds.fill()
}
}
在您的故事板中,选择包含您的弹出内容的视图并转到身份检查器
将类设置为 PopoverContentView
您的弹出框及其三角形现在将变为绿色。
您可以子类NSView
化并将其设置为NSPopover
视图控制器的视图。
您可以改用MAAttachedWindow。
是和不是。不幸NSPopover
的是,它的设计不是可定制的。contentViewController
您可以使用一些简单的技巧在's后面添加额外的背景视图,view
并根据需要对其进行着色或自定义。在这种情况下,您可以获得可自定义的背景,该背景将与通用NSPopover
边框和尾部相同。
有关更多详细信息,您可以查看NSPopover+MISSINGBackgroundView
实现此方法的类别代码,或者将这段代码用作 CocoaPod 库。
更改 NSPopover 颜色(包括三角形)的完整代码在这里:
我想人们已经迷上了弹出窗口和方法
#import "AppDelegate.h"
@interface MyPopoverBackgroundView : NSView
@end
@implementation MyPopoverBackgroundView
-(void)drawRect:(NSRect)dirtyRect
{
[[NSColor redColor] set];
NSRectFill(self.bounds);
}
@end
//===============================================================================================
@interface MyPopView : NSView
@end
@implementation MyPopView
-(void)viewDidMoveToWindow{
NSView *aFrameView = [[self.window contentView] superview];
MyPopoverBackgroundView * aBGView =[[MyPopoverBackgroundView alloc] initWithFrame:aFrameView.bounds];
aBGView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
[aFrameView addSubview:aBGView positioned:NSWindowBelow relativeTo:aFrameView];
[super viewDidMoveToWindow];
}
@end
//-----------------------------------------------------------------------------------------
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
//close when clicked outside
[self.popover setBehavior:NSPopoverBehaviorTransient];
//change its color
MyPopView *myPopview = [MyPopView new];
[self.popover.contentViewController.view addSubview:myPopview];
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
// Insert code here to tear down your application
}
- (IBAction)closePopover:(id)sender {
[self.popover close];
}
- (IBAction)showPopover:(id)sender {
[self.popover showRelativeToRect:[sender bounds]
ofView:sender
preferredEdge:NSMaxYEdge];
}
@end
这就是我更改弹出框颜色的方法。
假设您已经正确定义了 NSPopover:
//AppController.h
#import <Foundation/Foundation.h>
@interface AppController : NSObject
@property (weak) IBOutlet NSPopover errorPopover;
// whatever else you have ...
@end
//AppController.m
#import "AppController.h"
@implementation AppController
@synthesize errorPopover = _errorPopover;
// whatever else you have ...
-(IBAction)doSomethingThatCallsPopover:(id)sender {
_errorPopover.appearance = NSPopoverAppearanceHUD; //set color of error popup
[[self errorPopover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxXEdge];
}
@end
NSPopover 类参考- 我真的希望他们能在开发者文档中提供使用代码。