Передайте внешние распознаватели, если внутренние не получили прикосновение

У меня есть представление, и на нем программно нарисован круг. Также у меня есть распознаватель жестов, делегат которого проверяет, должен ли он получать прикосновение (должно быть, если касание было сделано на этом круге).

- (void)awakeFromNib
{
    [super awakeFromNib];

    circleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleHighlighted:)];
    [self addGestureRecognizer:circleTapRecognizer];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    CGPoint hit = [touch locationInView:self];

    if (gestureRecognizer == circleTapRecognizer) {
        BOOL hitsCircle = hit.x >= CGRectGetMidX(self.bounds) - self.circleRadius &&
                          hit.x <= CGRectGetMidX(self.bounds) + self.circleRadius &&
                          hit.y >= CGRectGetMidY(self.bounds) - self.circleRadius &&
                          hit.y <= CGRectGetMidY(self.bounds) + self.circleRadius;

        return hitsCircle;
    }

    return YES;
}

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


person efpies    schedule 04.03.2013    source источник
comment
Рад видеть, что вы выбрали версию без GestureRecognizer. Держите вещи простыми. :) Не могли бы вы ответить, почему вы передумали? (Просто для моего интереса)   -  person Mark Kryzhanouski    schedule 05.03.2013
comment
@MarkKryzhanouski Потому что распознаватель жестов не работал. В какой-то момент, когда метод в топике вернул NO, распознаватели базовых представлений не вызвались и ничего не произошло.   -  person efpies    schedule 05.03.2013


Ответы (1)


Есть решение без GestureRecognizer. Просто переопределите -(BOOL)[UIView pointInside:(CGPoint)point withEvent:(UIEvent *)event].

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    BOOL hitsCircle = hit.x >= CGRectGetMidX(self.bounds) - self.circleRadius &&
                      hit.x <= CGRectGetMidX(self.bounds) + self.circleRadius &&
                      hit.y >= CGRectGetMidY(self.bounds) - self.circleRadius &&
                      hit.y <= CGRectGetMidY(self.bounds) + self.circleRadius;

    return hitsCircle;
}

Для лучшего понимания обратитесь к документации Apple Определение пользовательского представления

person Mark Kryzhanouski    schedule 04.03.2013