Обнаружение касания глобально - PullRequest
3 голосов
/ 15 августа 2011

Я пытаюсь понять, как решить эту (довольно) простую проблему, но у меня ничего не получается, поэтому мне очень нужен ваш совет.

Мое приложение состоит из uitabbar с несколькими вкладками. В одном из них у меня есть куча UIImageViews, каждый из которых представляет миниатюру картинки. Точно так же, как вы удаляете приложения из iPhone, нажимая на секунду значок приложения, я реализовал распознаватель UILongPressGestureRecognizer, который начинает колебать большой палец. Если пользователь нажимает на «X», который появляется в углу большого пальца, изображение удаляется.

Логика, которая запускает и останавливает анимацию колебания, находится внутри подкласса UIImageView, который используется для отображения большого пальца.

Я пытаюсь отменить эффект колебания, если пользователь нажимает где-либо еще, кроме большого пальца. В идеале, если это возможно, я бы предпочел поместить код, который обнаруживает это отменное касание, в подкласс UIImageView.

Ответы [ 2 ]

6 голосов
/ 16 августа 2011

Чтобы перехватить все события касания в глобальном масштабе, я выделил 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
    ...

Надеюсь, это поможет другим.

0 голосов
/ 15 августа 2011

Если вы должны включить обнаружение кода в ваш подкласс uiimageview, то я сообщу приложению, что касание получено и где.Затем делегат приложения может сообщить все ваши uiimageviews или сказать viewcontroller, который скажет, что это uiimageviews.

непроверенный код:

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