Переадресация событий касания только на те виды, которые касаются - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть UIWindow с текстовым полем, кнопкой и таблицей. Я хотел бы иметь возможность отслеживать все прикосновения на экране, а затем пересылать их к элементу, к которому прикоснулись.

Я прочитал о переопределении sendEvent в документации Apple , но до сих пор не понимаю:

  1. Как использовать hitTest для извлечения элемента, к которому прикасались
  2. Как пересылать касания

Это то, что я имею до сих пор.

- (void) sendEvent:(UIEvent *)event
{

    for (UITouch *touch in [event allTouches])
    {
        /* Get coordinates of touch */
        CGPoint point = [touch locationInView:self];

        /* Get subview being touched */
        /* something like this???
           UIView *receiver = [self hitTest:point withEvent:event];            
         */

        /* Forward touch event to right view */
        /* how??? */

    }

    [super sendEvent:(UIEvent *)event];
}

Спасибо.

1 Ответ

2 голосов
/ 03 декабря 2011

Я не уверен, что это лучшее решение, но я следую тому, что было размещено здесь .

По сути, у меня есть подкласс UIView, охватывающий все пространство. Такой класс содержит ссылку на ВСЕ элементы, к которым можно прикоснуться. (хотелось бы, чтобы был способ избежать этого)

Это код в шапке

 @interface SubclassUIView : UIView {       
    UITextField *text;
    UITableView *table;
    UIButton        *button;
    UIToolbar       *toolbar;
}

И это реализация:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    CGPoint tableHit = [table convertPoint:point fromView:self];
    CGPoint buttonHit = [button convertPoint:point fromView:self];
    CGPoint toolbarHit = [toolbar convertPoint:point fromView:self];
    CGPoint messageHit = [text convertPoint:point fromView:self];

    if ([table pointInside:tViewHit withEvent:event]) return table;
    else if ([button pointInside:buttonHit withEvent:event]) return button;
    else if ([toolbar pointInside:toolbarHit withEvent:event]) return toolbar;
    else if ([text pointInside:messageHit withEvent:event]) return text;

    return [super hitTest:point withEvent:event];
}
...