在我的应用程序中,我希望滚动发生,仅使用鼠标滚轮操作而不是触控板上的两个手指动作。基本上,我试图确定是否从鼠标或触控板生成scrollWheelEvent,内部 - (void)scrollWheel:(NSEvent *)theEvent方法。据我所知,到目前为止,似乎没有直接的方法来实现这一目标。
我尝试了将boolean变量设置为true和false in - (void)beginGestureWithEvent:(NSEvent *)event;和 - (void)endGestureWithEvent:(NSEvent *)事件;但这不是一个解决方案,因为在调用endGestureWithEvent:方法之后,会多次调用scrollWheel:方法。
这是我的代码:
$BOOL fromTrackPad = NO;
-(void)beginGestureWithEvent:(NSEvent *)event;
{
fromTrackPad = YES;
}
-(void) endGestureWithEvent:(NSEvent *)event;
{
fromTrackPad = NO;
}
- (void)scrollWheel:(NSEvent *)theEvent
{
if(!fromTrackPad)
{
//then do scrolling
}
else
{
//then don't scroll
}
}
我知道这不是标准的,但这是我的要求。有谁知道这样做的方法?谢谢!
答案 0 :(得分:16)
-[NSEvent momentumPhase]
是解决方案。因此,从触发板生成的beginGesture和endGesture事件之间的事件返回NSEventPhaseNone
以外的值-[NSEvent phase]
,并且在endGesture事件之后生成的触控板事件返回{{1}以外的值} NSEventPhaseNone
。代码如下,
-[NSEvent momentumPhase]
答案 1 :(得分:8)
您可以使用[event hasPreciseScrollingDeltas]
进行区分。它被添加到OS X Lion中。它区分线滚动(鼠标滚轮)和像素滚动(触控板,魔术鼠标)事件。
答案 2 :(得分:2)
我在Swift中的回答,但对于Objective C逻辑是相同的:
override func scrollWheel(with event: NSEvent) {
if event.subtype == .mouseEvent {
// mouse
} else {
// trackpad
}
}
答案 3 :(得分:0)
@AProgrammer给出的答案可能不可用。因为魔术鼠标生成的滚轮事件的相位值为:开始,更改和结束。 强力鼠标生成的滚轮事件对于阶段和瞬时都具有无值。 因此该方法只能将强大的鼠标与魔术鼠标和触控板区分开来。