2011-08-15 202 views
3

我想弄清楚如何解決這個(相當)簡單的問題,但我失敗了,所以我真的需要你的建議。檢測全球觸摸

我的應用程序由一個包含多個選項卡的uitabbar組成。在其中的一箇中,我有一堆UIImageViews,每個都代表圖片的縮略圖。同樣,當您通過按下應用程序圖標一秒鐘從iPhone中移除應用程序時,我實現了一個UILongPressGestureRecognizer識別器,該識別器開始抖動拇指。如果用戶輕擊拇指角上出現的「X」,圖片就會被移除。

啓動和停止擺動動畫的邏輯位於用於顯示拇指的UIImageView的子類中。

我想要做的是取消搖擺的影響,如果用戶按下拇指外的任何地方。理想情況下,如果可能的話,我寧願將檢測到此取消觸摸的代碼置於UIImageView子類中。

回答

6

要趕上全球所有觸摸事件,我結束了繼承的UIWindow如下:

// CustomUIWindow.h 
#import <UIKit/UIKit.h> 

#define kTouchPhaseBeganCustomNotification @"TouchPhaseBeganCustomNotification" 

@interface CustomUIWindow : UIWindow 
@property (nonatomic, assign) BOOL enableTouchNotifications; 
@end 

// CustomUIWindow.m 
#import "CustomUIWindow.h" 

@implementation CustomUIWindow 

@synthesize enableTouchNotifications = enableTouchNotifications_; 

- (void)sendEvent:(UIEvent *)event 
{ 
    [super sendEvent:event]; // Apple says you must always call this! 

    if (self.enableTouchNotification) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:kTouchPhaseBeganCustomNotification object:event]; 
    } 
}@end 

然後每當我需要開始聽全觸控全球我做以下:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(stopThumbnailWobble:) 
              name:kTouchPhaseBeganCustomNotification 
              object:nil]; 

((CustomUIWindow *)self.window).enableTouchNotification = YES; 

在stopThumbnailWobble我刪除觀察者和PROC通過UITouch事件來決定是否刪除拇指:

- (void)stopThumbnailWobble:(NSNotification *)event 
{  
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:kTouchPhaseBeganCustomNotification 
                object:nil]; 
    ((CustomUIWindow *)self.window).enableTouchNotification = NO; 

    UIEvent *touchEvent = event.object; 
    // process touchEvent and decide what to do 
    ... 

希望這有助於他人。

+0

我的應用程序崩潰給出此錯誤消息:[UIWindow setEnableTouchNotifications:]:無法識別的選擇器發送到實例 –

+0

您是否繼承了UIWindow? –

+0

不,我把它解決了,因爲我的問題被其他方式解決..謝謝反正..至少我瞭解了一種新的東西,UIWindow是這樣subclassed。 –

0

如果您必須在您的uiimageview子類中包含代碼檢測,那麼我會告訴appdelegate已收到觸摸以及在哪裏。然後應用程序代表可以告訴你所有的uiimageviews,或者告訴viewcontroller它會告訴它是uiimageviews。

未經測試的代碼:

appDelegate = (myAppDelegate *)[[UIApplication sharedApplication] delegate]; 
[appDelegate touchedAt:(int)xPos yPos:(int)yPos]; 
+0

其實我正在尋找某種通知觀察,我可以從uiimageview代碼激活來驗證觸摸是在uiimageview本身內部還是外部。 在uiimageview之外觸摸會取消擺動效果。 –