Ограничить сенсорное событие для просмотра

У меня есть представление с двумя распознавателями жестов. Один левый и один правый.

Вдобавок к этому представлению у меня есть еще одно представление с двумя другими распознавателями жестов смахивания.

Моя проблема в том, что любое пролистывание, которое я делаю во втором представлении, также отправляется в родительское представление.

Как мне предотвратить это? И как предотвратить отправку события касания, инициированного в дочернем представлении B, в родительское представление A?

Благодарность!

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


person Victor C.    schedule 14.03.2012    source источник


Ответы (2)


Этого легко добиться с помощью свойства cancelsTouchesInView элемента UIGestureRecognizer. Установите для этого параметра значение YES в распознавателях подпредставления, и это должно предотвратить распространение жестов на родительское представление.

person oltman    schedule 14.03.2012
comment
Что делать, если у меня нет распознавателей жестов или касаний в дочернем представлении? Я просто хочу иметь возможность нажимать кнопки и прокручивать, не запуская распознаватели просмотра родителей. - person Victor C.; 15.03.2012
comment
Интересный. Я бы подумал, что вы должны иметь возможность переопределить метод touchesBegan в дочернем представлении, чтобы справиться с этим, но после нескольких минут игры с этим я не нашел рабочего решения. Этот ответ, скорее всего, вам нужен stackoverflow.com/a/5234804/144755 - person oltman; 15.03.2012

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

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

@interface TouchIgnorer : UIView
@property (nonatomic) NSMutableSet * ignoreOnViews;
@property (nonatomic) NSMutableSet * gesturesToIgnore;
@end
@implementation TouchIgnorer
- (id) init
{
    self = [super init];
    if (self)
    {
        _ignoreOnViews = [[NSMutableSet alloc] init];
        _gesturesToIgnore = [[NSMutableSet alloc] init];
    }
    return self;
}
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    CGPoint relativePt;
    for (UIView * view in _ignoreOnViews)
    {
        relativePt = [view convertPoint:point toView:view];
        if (!view.isHidden && CGRectContainsPoint(view.frame, relativePt))
        {
            for (UIGestureRecognizer * gesture in _gesturesToIgnore)
            {
                [self removeGestureRecognizer:gesture];
            }
            [self performSelector:@selector(rebindGestures) withObject:self afterDelay:0];
            break;
        }
    }
    return [super pointInside:point withEvent:event];
}

- (void) rebindGestures
{
    for (UIGestureRecognizer * gesture in _gesturesToIgnore)
    {
        [self addGestureRecognizer:gesture];
    }
}
@end
person DrDisc    schedule 15.04.2014