9

有没有办法给 NSPopover 上色?我见过像 facetab 这样的应用程序有很酷的颜色和可调整大小的弹出框,这是怎么做的?

Ay 指南,提示?

谢谢。

4

7 回答 7

2

设置popover.contentViewController.viewNSView具有自定义背景绘图的子类(即覆盖drawRect:并用您的自定义背景颜色填充矩形)。

然后设置popover.appearance = NSPopoverAppearanceHUD删除视图周围的默认边框。

请注意,视图周围仍然会有一个非常细的边框,因此如果您想完全删除它,您可能需要使用MAAttachedWindow或类似的解决方案。

于 2013-09-29T06:29:38.947 回答
2

在 Swift 4 中:

  1. 转到文件->新建文件->可可类
  2. 给你的班级命名。例如。流行色。确保它是 NSView 的子类
  3. 将文件内容设置为:
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()
    }
}
  1. 在您的故事板中,选择包含您的弹出内容的视图并转到身份检查器

  2. 将类设置为 PopoverContentView

您的弹出框及其三角形现在将变为绿色。

于 2018-06-24T06:08:22.050 回答
0

您可以子类NSView化并将其设置为NSPopover视图控制器的视图。

于 2013-01-28T17:39:55.820 回答
0

您可以改用MAAttachedWindow

于 2013-02-06T07:13:19.550 回答
0

是和不是。不幸NSPopover的是,它的设计不是可定制的。contentViewController您可以使用一些简单的技巧在's后面添加额外的背景视图,view并根据需要对其进行着色或自定义。在这种情况下,您可以获得可自定义的背景,该背景将与通用NSPopover边框和尾部相同。

有关更多详细信息,您可以查看NSPopover+MISSINGBackgroundView实现此方法的类别代码,或者将这段代码用作 CocoaPod 库。

于 2015-05-21T07:36:33.847 回答
0

更改 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
于 2018-05-09T09:48:52.210 回答
-4

这就是我更改弹出框颜色的方法。

假设您已经正确定义了 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 类参考- 我真的希望他们能在开发者文档中提供使用代码。

于 2011-12-16T01:20:17.927 回答