NSPopover并使用NSStatusItem

时间:2017-11-14 12:47:13

标签: objective-c macos nsstatusitem nspopover

我正在开发一个使用NSPopover的菜单栏应用。我使用以下代码来呈现popover。

[self.mainPopover showRelativeToRect:[testView bounds] ofView:testView preferredEdge:NSMinYEdge];

问题是这个位置离状态栏太近了,如下所示。

enter image description here

即使我改变了矩形它也没有任何效果,正如文档所述

  

locateView 中的矩形相对于弹片的位置。通常设置为positioningView的边界。可以是一个空矩形,它将默认为positioningView的边界。

以下是Dropbox应用程序的截图,我只是想知道如何在我的应用程序中添加一些间距,如dropbox。

enter image description here

2 个答案:

答案 0 :(得分:1)

为了达到这个目的,我添加了一个填充视图,并将set NSStatusItem View附加到该容器视图。对于任何想要实现它的人来说,使用的解决方案的代码如下。

_paddingView = [NSView new];
[_containerView addSubview:_paddingView];
[_containerView addSubview:_dragView];

[_dragView      setTranslatesAutoresizingMaskIntoConstraints:NO];
[_paddingView   setTranslatesAutoresizingMaskIntoConstraints:NO];
[_containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_dragView(22)][_paddingView(5)]|"                                                                                                                 options:0
                                                                       metrics:nil views:views]];
[_containerView addConstraint:[NSLayoutConstraint constraintWithItem:_dragView
                                                           attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual
                                                              toItem:_paddingView attribute:NSLayoutAttributeLeft
                                                          multiplier:1. constant:0]];
[_containerView addConstraint:[NSLayoutConstraint constraintWithItem:_dragView
                                                           attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual
                                                              toItem:_paddingView attribute:NSLayoutAttributeRight
                                                          multiplier:1. constant:0]];

self.mainPopover = [[NSPopover alloc] init];
self.mainPopover.delegate = self;
self.mainPopover.backgroundColor = [NSColor greenColor];
[self.mainPopover setAnimates:NO];
[self.mainPopover setBehavior:NSPopoverBehaviorTransient];
[self.mainPopover setContentViewController:viewController];

[_containerView layoutSubtreeIfNeeded];

[_statusItem setView:_containerView];

答案 1 :(得分:0)

您可以插入测试视图边界以在de view和popover之间添加一些边距:

NSPopover *mainPopover = [self mainPopover];
NSRect bounds = CGRectInset([testView bounds], -50.0, -50.0);
[mainPopover showRelativeToRect:bounds ofView:testView preferredEdge:NSMinYEdge];