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

@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

这编译并运行良好,并且 View 按预期呈现。 mouseDown: 事件已正确注册。但是,不会触发任何其他事件。 begin/endGestureWithEvent: 方法和 swipeWithEvent: 方法都不是。这让我想知道:我是否需要在某处设置项目/应用程序设置以正确接收和/或解释手势?先谢谢您的帮助。

最佳答案

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

  • 在页面之间滑动:
  • 用两个或三个手指滑动,或
  • 三指滑动


  • 在全屏应用之间滑动:
  • 用四根手指向左或向右滑动

  • 具体来说,全屏应用之间的滑动不应设置为三指,否则您将不会收到 swipeWithEvent: 消息。

    这两个首选项设置一起导致 swipeWithEvent:消息发送到第一响应者。

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

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

    10-07 19:34