Игнорировать прикосновения к фоновому (супер) виду - PullRequest
3 голосов
/ 09 июля 2009

Как я должен обрабатывать, а точнее НЕ обрабатывать (игнорировать) прикосновения к моему фоновому виду? Это происходит с представлением моего View Controller, у которого есть подпредставления (объекты), на которые я действительно хочу реагировать на сенсорные события. Установка userInteractionEnabled = NO для представления, по-видимому, также отключает ВСЕ взаимодействие для подпредставлений.

Я сейчас тестирую на

if ([[touch view] superview] == self.view) 

в касаниях Начало / Перемещение / Завершено. Но я пытаюсь исключить некоторые условные проверки, поэтому ищу лучший способ ...

Ответы [ 2 ]

2 голосов
/ 25 февраля 2013

Спасибо за ответ, Дэн, тоже отличный вопрос.

Однако в принятом ответе есть ошибка: подпункты hitTesting должны быть выполнены с точкой, преобразованной в подпредставление. Кроме того, subviewIndex уже определен до 'for'.

Поскольку подпредставления упорядочены в соответствии с их z-индексом, итерации должны идти от последнего к первому (см. Обработка событий для iOS - как связаны между собой hitTest: withEvent: и pointInside: withEvent:? и Как получить индекс иерархии UIView ??? (т.е. глубину между другими подпредставлениями) ).

Вот обновленный код:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hitView = nil;
    NSArray *subviews = [self subviews];
    int subviewIndex, subviewCount = [subviews count];
    for (subviewIndex = subviewCount-1; !hitView && subviewIndex >= 0; subviewIndex--) {
        UIView *subview = [subviews objectAtIndex:subviewIndex];
        hitView = [subview hitTest:[self convertPoint:point toView:subview] withEvent:event];
    }
    return hitView;
}
2 голосов
/ 09 июля 2009

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; рекурсивно вызывает -pointInside:withEvent:. точка находится в координатах кадра

Если вы переопределите это в фоновом режиме, вы можете указать, какое подпредставление получит удар - вы можете быть ленивым и просто спросить каждое из ваших подпредставлений, вернут ли они ему «да», и никогда не вернутся сами (верните ноль, если они все вернутся. ноль). Что-то вроде:

UIView *hitView = nil;
NSArray *subviews = [self subviews];
int subviewIndex, subviewCount = [subviews count];
for (int subviewIndex = 0; !hitView && subviewIndex < subviewCount; subviewIndex++) {
    hitView = [[subviews objectAtIndex:subviewIndex] hitTest:point withEvent:event];
}
return hitView;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...