Mac可可 - 我如何检测触控板滚动手势?

时间:2011-07-10 15:52:14

标签: objective-c cocoa macos trackpad

我想检测滚动手势(触控板上有两根手指)。 我该怎么做?

3 个答案:

答案 0 :(得分:25)

您希望覆盖视图的scrollWheel:方法。您可以使用NSEvent的{​​{1}}和deltaX方法来了解用户滚动的数量。

代码:

deltaY

您也可以查看Handling Trackpad Events Guide。这将向您展示如何捕获自定义手势,以及标准手势。

答案 1 :(得分:12)

您应该通过在自定义子类中实现NSView的触摸事件方法来实现。 这些方法是:

- (void)touchesBeganWithEvent:(NSEvent *)event;
- (void)touchesMovedWithEvent:(NSEvent *)event;
- (void)touchesEndedWithEvent:(NSEvent *)event;
- (void)touchesCancelledWithEvent:(NSEvent *)event;

作为参数出现的NSEvent对象包含有关涉及的触摸的信息。特别是,您可以使用以下方法检索它们:

-(NSSet *)touchesMatchingPhase:(NSTouchPhase)phase inView:(NSView *)view;

此外,在自定义视图子类中,您必须首先将其设置为:

[self setAcceptsTouchEvents:YES]; 

为了收到此类事件。

答案 2 :(得分:6)

要检测scrollWheel事件,请使用 - (void)scrollWheel:(NSEvent *)theEvent方法。

    - (void)scrollWheel:(NSEvent *)theEvent
    {
        //implement what you want
    }

使用鼠标滚轮或触控板上的双指手势滚动时,将调用上述方法。

如果您的问题是确定scrollWheel事件是否由鼠标或触控板生成,那么根据Apple的文档,这是不可能的。虽然这是一个解决方法,

- (void)scrollWheel:(NSEvent *)theEvent
    {
        if([theEvent phase])
        {
            // theEvent is generated by trackpad
        }
        else
        {
            // theEvent is generated by mouse
        }
    }

您也可以使用-(void)beginGestureWithEvent:(NSEvent *)event;-(void)endGestureWithEvent:(NSEvent *)event。这些方法分别在-(void)scrollWheel:(NSEvent *)theEvent之前和之后调用。

有一种情况不起作用 - 如果您使用两个手指手势更快并且手指快速离开触控板,那么您可能会遇到问题 - (Memory is not getting released