2011-09-15 85 views
7

我正在编写一个针对OS X Lion和Snow Leopard的应用程序。我有一个观点,我想对滑动事件做出响应。我的理解是,如果在我的自定义视图中实现该方法,那么三指轻扫将会调用-[NSResponder swipeWithEvent:]。我已经看过this问题和相应答案,并试图以下修改存根实现的奥斯卡德尔本的代码:- [NSResponder swipeWithEvent:] not called

@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:方法。这让我想知道:我是否需要在某处设置项目/应用程序设置以正确接收和/或解释手势?先谢谢您的帮助。

+0

作为一个侧面说明,就可以得到'滚动手势 - [NSResponder类滚轮:]',但我想专门使用三指手势 – nomothetis

回答

9

要接收swipeWithEvent:消息,您必须确保三指滑动手势未映射到可能导致冲突的任何事物。进入系统设置 - >触控板 - >更多手势,并设置这些首选项来执行下列操作之一:

  • 页面之间轻扫:

    1. 刷卡有两个或三个手指,或
    2. 用三根手指

刷卡
  • 全屏幕应用程序之间滑动:

    1. 向左或向右滑动四个指

具体来说,全屏应用软件之间的刷卡不应该被设定为三根手指,否则你不会得到swipeWithEvent:消息。

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

当然,你仍然需要实现实际的刷卡逻辑。如果你想在iOS上执行流畅的滚动操作,那么你需要做更多的工作。有一个示例说明如何在Lion App Kit发行说明中的​​“Fluid Swipe Tracking”一节中进行此操作。“

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

+0

对不起,以便回复;我认为当有人回复时,会给我发电子邮件。我使用BetterTouchTool,所以这很可能是因为事情没有按照我喜欢的方式工作。我会看看它;同时,我认为这个答案提供了必要的信息,所以我将它标记为正确。 – nomothetis

0

您的看法是否接受急救员?

- (BOOL) acceptsFirstResponder 
{ 
    return YES; 
} 
+0

我假设你的意思是' - (布尔)acceptedFirstResponder';我没有它,但我只是试了它,它没有工作 – nomothetis

+0

是的,我编辑了答案。您是否将手指滑过您的视图? –

+0

是的;我实现了响应滚动手势的其他功能,并且按预期工作,就像'mouseUp :'回调。 – nomothetis

1

不知道是否是问题,但只有关键窗口接收到手势。你的窗户钥匙?

+0

它应该是;它是应用程序中唯一的窗口,它接收滚动事件。有没有什么东西可能会让它成为除我之外的关键,而不会将它设置为关键? – nomothetis

+0

非关键窗口仍然会收到滚轮事件(这就是为什么您可以在背景窗口上双指拖动。) –

+0

我检查过;这是关键。我会看看我是否可以创建一个小型项目来重现行为(这是目前正在发生的中等规模的应用程序中)。 – nomothetis

2

尝试[self setAcceptsTouchEvents:YES];它说:// Initialization code here.

+0

我相信你的意思是[self setAcceptTouchEvents:YES]; –

+0

或者简单地覆盖acceptingTouchEvents为您的视图返回YES。 – uchuugaka