当菜单溢出屏幕时相对于按钮的popUpContextMenu?

时间:2014-07-01 22:05:21

标签: objective-c cocoa

我尝试在点击按钮时显示NSMenu以显示一些共享选项(我无法使用NSSharingServicePicker,因为我需要在后台生成可共享项目)。我通过一个简单的IBAction

来做到这一点
- (IBAction)showShareSheet:(id)sender{
    NSRect frame = [(NSButton *)sender frame];
    NSPoint menuOrigin = [[sender superview] convertPoint:NSMakePoint(
        frame.origin.x, 
        frame.origin.y + frame.size.height + 95
    ) toView:self.dataView];
    NSEvent *event = [NSEvent mouseEventWithType:
        NSLeftMouseDown
        location:menuOrigin
        modifierFlags:(int)nil
        timestamp:0
        windowNumber:[[(NSButton *)sender window] windowNumber]
        context:[[(NSButton *)sender window] graphicsContext]
        eventNumber:0
        clickCount:1
        pressure:1
    ];
    [NSMenu popUpContextMenu:theMenu withEvent:event forView:sender];
}

如果窗口不太靠近屏幕边缘,这通常可以正常工作。如果是,正常位置会跳跃,因为没有足够的空间容纳菜单:

http://i.imgur.com/4DFS6EO.jpg http://i.imgur.com/yeN9dVx.jpg?1

我通过确定溢出来解决这个问题:

float marginRight = NSScreen.mainScreen.frame.size.width - (self.window.frame.origin.x + self.window.frame.size.width);
float overflow = self.window.frame.size.width + marginRight - frame.origin.x  - theMenu.size.width - 7;
float difference = 0;
if (overflow < 0){
    difference = overflow;
}

然后将difference添加到frame.origin.x(实际上减去它),但这是一个丑陋的修复。我的计算也是关闭的,这就是我需要减去7的原因。

我是否忽略了相对于按钮定位菜单的更有效方式? NSShaingServicePicker的{​​{1}}方法在幕后为我计算了这个,并且不要求我做任何额外的计算以避免跳跃。

0 个答案:

没有答案