1

我想在 Xcodes Utilities 侧面板中创建类似的按钮行(见图)。

XcodeUtilitiesButtons

我很容易在彼此旁边添加四个图像按钮。但是,有一个功能我还没有解决。

如果您按住其中一个按钮,您可以在任何按钮之间悬停(同时按住鼠标),然后如果鼠标悬停在每个按钮上,则会显示每个按钮的交替图像,当您松开该按钮时选择。

我还没有找到任何提供这个的默认元素,所以我一直在修补不同的解决方案。

我需要继承NSButton来捕获-mouseDown事件并创建我自己的事件跟踪循环,这很清楚。从那我应该能够检查鼠标指向的位置(按下按钮时),只需调用它指向的按钮并将其设置为显示的备用图像。

我的想法是创建一个NSView来保存按钮,以便它可以处理鼠标点的检查,然后调用所有按钮。

但是通过这种方法,我被困在试图在视图中找到按钮的位置。我已经向按钮添加了一个IBOutlet,如果我从我的视图中调用按钮-frame我总是得到 0 结果:

NSLog(@"%@", NSStringFromRect([_button frame]));
{{0, 0}, {0, 0}}

我已经尝试了我能想到的convertRect:toViewconvertRect:fromView的所有变体,但没有任何结果。(因为我没有从按钮的-frame调用中得到有效的输出)。

所以,我有两个问题:

  1. 这是一种有效的方法吗?如果不是,什么是更好的解决方案?

  2. 如何在自定义视图(Buttons superview)中获取按钮的位置,以了解鼠标是否悬停在按钮上。

我目前正在这样做(使用 BOOL isInsideButton 检查不起作用。

- (void)mouseDown:(NSEvent *)theEvent {
    BOOL keepOn = YES;
    BOOL isInsideView = YES;
    BOOL isInsideButton = YES;
    NSPoint mouseLoc;

    while (keepOn) {
        theEvent = [[self window] nextEventMatchingMask: NSLeftMouseUpMask |
                NSLeftMouseDraggedMask];
        mouseLoc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
        isInsideView = [self mouse:mouseLoc inRect:[self bounds]];
        isInsideButton = [self mouse:mouseLoc inRect:[self.superview convertRect:[_buttonOne frame] toView:self]];
    };
    return;
}
4

0 回答 0