我尝试在点击按钮时显示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];
}
如果窗口不太靠近屏幕边缘,这通常可以正常工作。如果是,正常位置会跳跃,因为没有足够的空间容纳菜单:
我通过确定溢出来解决这个问题:
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}}方法在幕后为我计算了这个,并且不要求我做任何额外的计算以避免跳跃。