Индикатор активности над кнопкой предотвращает распознавание кликов - PullRequest
3 голосов
/ 14 ноября 2011

У меня есть кнопка UIB " bn " и индикатор UIActivityIndicator " ai ", который находится над кнопкой (ai.center = bn.center).

Пока ai видим и анимирован, я не могу нажать кнопку под рамкой ai , но за пределами диапазона я могу.

Нужно ли добавлять GestureRecognition к ai или есть более разумный способ нажать на кнопку " ai ".

С уважением.$ Ч @ скалистый

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011

Можете ли вы просто установить ai.userInteractionEnabled = NO;?Я удивлен, что в любом случае он включен для индикатора активности - это стандартный компонент или вы сделали подкласс?

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

0 голосов
/ 16 ноября 2011

Используйте следующие вещи:

Сначала создайте подкласс для UIActivityIndicator со следующим переопределением метода:

@interface MyActivityIndicator: UIActivityIndicator
@end

@implementation MyActivityIndicator

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    return NO;
}

@end

После этого используйте MyActivityIndicator везде в вашем проекте вместо UIActivityIndicator (в файле NIB или в вашем коде, зависит от того, где вы его создаете)

0 голосов
/ 14 ноября 2011

Вам необходимо переопределить метод UIView

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

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

Этот метод пересекает иерархию представлений, отправляя pointInside: withEvent: сообщение для каждого подпредставления, чтобы определить, какой подпредставление должно получить сенсорное событие. Если pointInside: withEvent: возвращает YES, затем иерархия подпредставления пересматривается; в противном случае его ветвь иерархии представления игнорируется. Вам редко нужно называть это метод сам, но вы можете переопределить его, чтобы скрыть сенсорные события от подвиды .

EDIT:

Скажем, у вас есть подкласс UIView, который содержит bn и ai, вы можете реализовать метод, подобный этому

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (CGRectContainsPoint(bn.frame, point)) {
        return bn;
    }
    return nil;
}

таким образом, ваша кнопка будет получать сенсорные события (если они находятся внутри своего кадра), независимо от того, находится ли что-то поверх нее или нет. Вам не нужно больше ничего делать.

...