NSPopover显示相对于NSStatusItem

时间:2015-10-20 08:11:35

标签: objective-c swift nsstatusitem nspopover

这是我的代码:

if #available(OSX 10.10, *) {
    if let b = statusItem.button {
        popover.showRelativeToRect(b.bounds, ofView: b, preferredEdge: .MinY)
    }
} else {
}

else块适用于OS X Mavericks,因为NSStatusItem.button不可用。有没有一种简单的方法来显示相对于状态项的弹出窗口?如果没有,是否可以在没有箭头的情况下在屏幕中央显示弹出窗口?

1 个答案:

答案 0 :(得分:1)

在您访问statusitem按钮之前,您必须提供自己的视图。 然后所有工作都相同

要保留原始行为,请绘制一个看起来像状态项的自定义视图;)

e.g。

@interface DDQuickMenuStatusItemView : NSView
@property(weak) NSStatusItem *item;
//...
@end


@implementation DDQuickMenuStatusItemView

//...

- (void)drawRect:(NSRect)dirtyRect {
    NSImage *image = nil;
    if(self.item) {
        [self.item drawStatusBarBackgroundInRect:self.bounds withHighlight:NO];
        image = self.item.image;
    }

    if(image) {
        NSRect r = self.bounds;
        r.size = [image size];
        r = [self.class centerRect:r inRect:self.bounds];
        r = [self centerScanRect:r];
        [image drawInRect:r fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
    }
}

#pragma mark -

+ (CGRect)centerRect:(CGRect)rect inRect:(CGRect)inRect
{
    CGRect result = rect;
    result.origin.x = inRect.origin.x + (inRect.size.width - result.size.width)*0.5f;
    result.origin.y = inRect.origin.y + (inRect.size.height - result.size.height)*0.5f;
    return result;
}

@end

请注意,该视图是示例而非生产就绪;)