我想在 Xcodes Utilities 侧面板中创建类似的按钮行(见图)。
我很容易在彼此旁边添加四个图像按钮。但是,有一个功能我还没有解决。
如果您按住其中一个按钮,您可以在任何按钮之间悬停(同时按住鼠标),然后如果鼠标悬停在每个按钮上,则会显示每个按钮的交替图像,当您松开该按钮时选择。
我还没有找到任何提供这个的默认元素,所以我一直在修补不同的解决方案。
我需要继承NSButton来捕获-mouseDown事件并创建我自己的事件跟踪循环,这很清楚。从那我应该能够检查鼠标指向的位置(按下按钮时),只需调用它指向的按钮并将其设置为显示的备用图像。
我的想法是创建一个NSView来保存按钮,以便它可以处理鼠标点的检查,然后调用所有按钮。
但是通过这种方法,我被困在试图在视图中找到按钮的位置。我已经向按钮添加了一个IBOutlet,如果我从我的视图中调用按钮-frame我总是得到 0 结果:
NSLog(@"%@", NSStringFromRect([_button frame]));
{{0, 0}, {0, 0}}
我已经尝试了我能想到的convertRect:toView和convertRect:fromView的所有变体,但没有任何结果。(因为我没有从按钮的-frame调用中得到有效的输出)。
所以,我有两个问题:
这是一种有效的方法吗?如果不是,什么是更好的解决方案?
如何在自定义视图(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;
}