0

У меня есть подкласс UIViewController, представление которого, как правило, содержит некоторое количество UIButtons и других интерактивных элементов, которые могут содержать один или несколько жестов, прикрепленных к ним.iOS/ObjC: распознаватель жестов жесткого диска?

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

Есть ли простой способ сделать это, что бы не требуют моего присоединения какой-либо дополнительной логики для интерактивных элементов в представлении, или, по крайней мере, позвольте мне автоматически прикрепить такую ​​логику путем обхода иерархии вида?

ответ

1

Вы можете переопределить метод контейнера и вернуть NO, если есть интерактивный элемент под расположенным положением, и в противном случае вернуть YES. Случай, когда вы возвращаете YES, будет соответствовать постукиванию по пустому месту.

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    // Perform some checks using the CGRectContainsPoint method 
    // e.g. CGRectContainsPoint(oneOftheSubviews.frame, point) 
} 

Хорошей альтернативой является использование метода hitTest:withEvent:, как в приведенном ниже примере:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *hitView = [super hitTest:point withEvent:event]; 
    if (hitView != someView) return nil; 
    return hitView; 
} 

[super hitTest:point withEvent:event] вернет самую глубокую точку зрения в иерархии этой точки зрения, который был использован.

Таким образом, вы можете проверить тип hitView, и если он соответствует одному из ваших интерактивных подзонов, верните его. Если он равен self, то это означает, что под подставленным местоположением нет подсмотра, что в вашем случае означает, что пользователь постучал по пустой области. В этом случае вы сделаете все, что хотите, а затем верните nil.

+0

Как я могу определить, есть ли там интерактивный элемент без, скажем, списка интерактивных элементов? – DanM

+0

(Чтобы уточнить: многие интерактивные элементы содержатся в сторонних элементах управления, поэтому я не всегда знаю, что они собой представляют) – DanM

+1

См. Мой обновленный ответ. Во всех случаях вам нужно будет определить, является ли subview, который вы получаете, одним из интерактивных, которые вы хотите. Существует не автоматический способ сделать то, что вам нужно. Но вам не нужно добавлять какую-либо пользовательскую логику в свои подзаголовки. –

Смежные вопросы