Обнаружение касания и касания в представлении, содержащем UIControls - PullRequest
1 голос
/ 18 июня 2011

Я пытаюсь определить, когда пользователь касается вниз и вверх в представлении.Представление содержит некоторые кнопки и другие элементы управления UIKit.Я хотел бы обнаруживать эти сенсорные события, но не использовать их.

Я пробовал два подхода, но ни одного из них не было достаточно:

Сначала я добавил прозрачное наложение, перекрывающее -touchesBegan: withEvent:и -touchesEnded: withEvent: и перенаправить событие следующему респонденту с

[self.nextResponder touchesBegan:touches withEvent:event]

Однако кажется, что объекты UIKit игнорируют все перенаправленные события.

Далее я попытался переопределить -pointInside:withEvent: и -hitTest: withEvent:.Это прекрасно работает для обнаружения событий прикосновения down , но pointInside :: и hitTest :: не вызываются при прикосновении up (то есть [[[event allTouches] anyObject] phase] никогда не бывает равным)to UITouchPhaseEnded).

Каков наилучший способ обнаружения событий касания и касания без нарушения взаимодействия с базовыми элементами UIControls?

1 Ответ

0 голосов
/ 18 июня 2011

в соответствии с Руководством по обработке событий для iOS у вас есть 3 варианта:

1) подкласс UIWindow для переопределения sendEvent:

2) с использованием наложения

3) проектирование так, чтобы вам не приходилось это делать ... так что больше похоже на 2 варианта.

Вот пример упрощения яблок с использованием подкласса UIWindow;

1) измените класс вашего окна в NIB на ваш подкласс UIWindow. 2) поместите этот метод в файл .m.

- (void)sendEvent:(UIEvent *)event
{
    NSSet * allTouches = [event allTouches];

    NSMutableSet *began = nil;
    NSMutableSet *moved = nil;
    NSMutableSet *ended = nil;
    NSMutableSet *cancelled = nil;

    // sort the touches by phase so we can handle them similarly to normal event dispatch
    for(UITouch *touch in allTouches) {
        switch ([touch phase]) {
            case UITouchPhaseBegan:
                if (!began) began = [NSMutableSet set];
                [began addObject:touch];
                break;
            case UITouchPhaseMoved:
                if (!moved) moved = [NSMutableSet set];
                [moved addObject:touch];
                break;
            case UITouchPhaseEnded:
                if (!ended) ended = [NSMutableSet set];
                [ended addObject:touch];
                break;
            case UITouchPhaseCancelled:
                if (!cancelled) cancelled = [NSMutableSet set];
                [cancelled addObject:touch];
                break;
            default:
                break;
        }

        // call our methods to handle the touches
        if (began)
        {
            NSLog(@"the following touches began: %@", began);
        };
        if (moved)
        {
            NSLog(@"the following touches were moved: %@", moved);
        };
        if (ended)
        {
             NSLog(@"the following touches were ended: %@", ended);
        };
        if (cancelled) 
        {
             NSLog(@"the following touches were cancelled: %@", cancelled);
        };
    }
    [super sendEvent:event];
}

У него слишком много выходных данных, но вы поймете идею ... и сможете привести свою логику в нужное место.

...