2011-09-15 67 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