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