Pet*_*isu 13 macos cocoa nsview nsbutton nscontrol
如果未启用NSButton,则mouseDown:和mouseUp:按预期运行(因此,当按下鼠标时,将调用mouseDown:,当它被释放时,将调用mouseUp:)
但是,如果启用了NSButton IS,则完全不会调用mouseUp:并且在鼠标释放后调用mouseDown:
- (void)mouseDown:(NSEvent *)theEvent {
[super mouseDown:theEvent];
}
- (void)mouseUp:(NSEvent *)theEvent {
[super mouseUp:theEvent];
}
Run Code Online (Sandbox Code Playgroud)
为什么这种行为有所不同,我如何强制执行正确的行为(与未启用按钮时相同)
小智 15
如果有人还在寻找这个...我不知道为什么但这对我有用...
- (void)mouseDown:(NSEvent *)theEvent {
NSLog(@"mouse down!");
[super mouseDown:theEvent];
NSLog(@"mouse up!");
}
Run Code Online (Sandbox Code Playgroud)
行为是正确的.您对所有鼠标事件都通过响应方法的期望是错误的.
当启用该按钮时,超类实现-mouseDown:将运行内部事件跟踪循环以跟踪鼠标移动并将按钮显示为按下,只要鼠标位于其中并在鼠标移出时将其显示为未按下.此内部事件循环是接收NSLeftMouseUp事件的内容.它永远不会发送给响应方法.
请参阅Cocoa事件处理指南:处理鼠标事件 - 处理鼠标拖动操作 - 鼠标跟踪循环方法.
如果希望创建一个自定义按钮,如果希望创建一个自定义按钮,该按钮的操作方法可以区分按下和释放,请尝试isPressed向其添加属性,以及以下代码:
(void)mouseDown:(NSEvent *)event
{
self.isPressed = true;
[super mouseDown:event];
self.isPressed = false;
[self.target performSelector:self.action withObject:self];
}
Run Code Online (Sandbox Code Playgroud)
必须将自定义按钮设置为根据以下条件发送操作:
[self.button sendActionOn: NSLeftMouseDownMask | NSLeftMouseUpMask];
Run Code Online (Sandbox Code Playgroud)
否则,直到释放按钮后才调用action方法。
在动作方法中,isPressed可以查询。例如:
int state = (int)[sender isPressed];
Run Code Online (Sandbox Code Playgroud)
这方面的一个小麻烦,但无害的“功能”是action方法被调用时两次释放按钮:从内部曾经NSButton有isPressed仍然如此。(这应该忽略。)第二次来自自定义按钮的performSelector方法,为isPressedfalse。
是否对将来的发行版有任何评论?
| 归档时间: |
|
| 查看次数: |
4401 次 |
| 最近记录: |