鼠标按下时多个NS按钮跟踪悬停

时间:2016-02-01 11:26:41

标签: objective-c nsbutton nscontrol

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

XcodeUtilitiesButtons

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

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

我还没有发现任何默认元素,所以我一直在修补不同的解决方案。

我需要继承 NSButton 以捕获 -mouseDown 事件并创建我自己的事件跟踪循环,以便明确。从那里我可以检查鼠标指向的位置(按下按钮时),只需调用它指向的按钮并设置它的替代图像即可显示。

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

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

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

我已尝试过 convertRect:toView convertRect:fromView 的所有变体,我可以想到没有任何结果。 (因为我没有从按钮的 -frame 调用中获得有效输出。)

所以,我有两个问题:

  1. 这是一种有效的方法,如果没有,那会是更好的解决方案吗?

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

  3. 我目前正在这样做(使用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;
    }
    

0 个答案:

没有答案