全局检测触摸

时间:2011-08-15 11:57:35

标签: iphone uigesturerecognizer uitouch

我试图弄清楚如何解决这个(相当)简单的问题,但我失败了,所以我真的需要你的建议。

我的应用程序包含一个带有多个标签的uitabbar。在其中一个我有一堆UIImageViews,每个UIImageViews代表一个图片的缩略图。同样,当您通过在应用程序图标上按下一秒钟从iPhone中删除应用程序时,我实现了一个UILongPressGestureRecognizer识别器,它开始摆动拇指。如果用户点击拇指角上出现的“X”,图片就会被移除。

启动和停止摆动动画的逻辑位于UIImageView的子类中,用于显示拇指。

如果用户按下拇指以外的任何其他位置,我正在尝试取消摆动效果。理想情况下,如果可能的话,我更愿意将检测此取消触摸的代码放在UIImageView子类中。

2 个答案:

答案 0 :(得分: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中我删除观察者并处理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
    ...

希望这有助于他人。

答案 1 :(得分:0)

如果你必须在你的uiimageview子类中包含代码检测,那么我会告诉appdelegate接收到触摸以及在哪里。然后,应用程序委托可以告诉你所有的uiimageviews或告诉viewcontroller哪个会告诉它的uiimageviews。

未经测试的代码:

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