2011-06-17 3 views
1

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

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

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

[self.nextResponder touchesBegan:touches withEvent:event] 

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

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

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

+0

Я не вижу причин, по которым ответчик будет игнорировать 'touchhesBegan: withEvent:' просто потому, что он был отправлен еще что-то с тем же событием. Это бросает вызов точке цепи ответчиков. Вы уверены, что 'nextResponder' что-то возвращает? –

+0

@Peter «Классы UIKit framework не предназначены для получения касаний, которые не привязаны к ним, в программных терминах это означает, что свойство view объекта UITouch должно содержать ссылку на объект рамки для прикосновения Если вы хотите условно переадресовать касания другим респондентам в вашем приложении, все эти респонденты должны быть экземплярами ваших собственных подклассов UIView ». (http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html) – tba

ответ

-1

по Event Handling Guide for 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]; 
} 

Он имеет слишком много продукции, но вы получите идею ... и можете сделать вашу логику, способным, где вы хотите.

+0

Если я обнаруживаю штрихи в оверлее, вызов [super touchhesBegan:] не пересылает событие к точкам снизу. И если я обнаруживаю прикосновения в родительском представлении, дочерний UIButton потребляет штрихи и мои прикосновенияBegan: никогда не вызывается. – tba

+0

позвольте мне запустить быстрый тест ... –

+0

Вы были правы в этом, UIView проглотил события, я модифицировал пример яблок подкласса UIWindow. –

Смежные вопросы