- [NSResponder swipeWithEvent:]未调用

时间:2011-09-15 15:07:37

标签: cocoa osx-lion swipe gestures

我正在编写一个针对OS X Lion和Snow Leopard的应用程序。我有一个观点,我想要回应滑动事件。我的理解是,如果在我的自定义视图中实现了该方法,则三指滑动将调用-[NSResponder swipeWithEvent:]。我已经查看了this问题和相应的答案,并尝试了Oscar Del Ben代码的以下修改后的存根实现:

@implementation TestView

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor redColor] set];
    NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
}

- (void)swipeWithEvent:(NSEvent *)event {
    NSLog(@"Swipe event detected!");
}

- (void)beginGestureWithEvent:(NSEvent *)event {
    NSLog(@"Gesture detected!");
}

- (void)endGestureWithEvent:(NSEvent *)event {
    NSLog(@"Gesture end detected!");
}

- (void)mouseDown:(NSEvent *)theEvent {
    NSLog(@"mouseDown event detected!");
}

@end

这个编译并运行正常,视图按预期呈现。 mouseDown:事件已正确注册。但是,没有其他事件被触发。既不是begin/endGestureWithEvent:方法,也不是swipeWithEvent:方法。这让我想知道:我是否需要在某处设置项目/应用程序设置以正确接收和/或解释手势?在此先感谢您的帮助。

4 个答案:

答案 0 :(得分:10)

要接收 swipeWithEvent:消息,您必须确保3指滑动手势未映射到可能导致冲突的任何内容。转到系统偏好设置 - >触控板 - >更多手势,并将这些首选项设置为以下之一:

  • 在页面之间滑动:

    1. 用两根或三根手指轻扫,或
    2. 用三根手指轻扫

  • 在全屏应用之间滑动:

    1. 用四根手指向左或向右滑动

具体而言,全屏应用之间的滑动不应设置为三个手指,否则您将无法获得 swipeWithEvent:消息。

同时,这两个首选项设置会将 swipeWithEvent:消息发送给第一个响应者。

当然,您仍然需要实现实际的滑动逻辑。如果你想在iOS上进行流畅的滚动滑动,那么你需要做更多的工作。有关如何在“流体扫描跟踪”部分的Lion App Kit发行说明中执行此操作的示例。

请参阅http://developer.apple.com/library/mac/#releasenotes/Cocoa/AppKit.html

答案 1 :(得分:2)

尝试使用[self setAcceptsTouchEvents:YES]; // Initialization code here.

答案 2 :(得分:1)

不确定是否是问题,但只有关键窗口才会收到手势。你的窗户钥匙?

答案 3 :(得分:0)

您的观点是否接受了第一响应者?

- (BOOL) acceptsFirstResponder
{
  return YES;
}