Подтвердить что ты не робот

В iOS, если супервизор userInteractionEnabled равен NO, тогда все subviews также отключены?

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

Но верно ли, что если для супервизора userInteractionEnabled установлено значение НЕТ, то все подзаголовки и потомство также отключены для взаимодействия с пользователем? Что делать, если мы хотим отключить только основной вид, но не хотим отключать его для просмотра?

4b9b3361

Ответ 1

Вы не можете этого сделать,

Вместо этого вы измените расположение своих представлений следующим образом:

Main View-> subViews

Для

Container View -> Main View that you want to set as inactive
               -> other views that you want to still active

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

Ответ 2

Если это может быть полезно, я нашел это в Программе iOS 5 от Matt Neuburg, p. 467:

userInteractionEnabled

Если установлено значение НЕТ, этот вид (вместе с его подзонами) исключается из получая прикосновения. Прикосновения к этому виду или к одному из его через "к виду за ним.

Кроме того, руководство Apple по обработке событий для iOS говорит:

В объекте window используется тестирование hit-testing и цепочка ответчиков, чтобы найти чтобы получить событие касания. При тестировании удаленных окон открывается окно hitTest: withEvent: в самом верхнем виде иерархии представлений; это метод рекурсивно вызывает pointInside: withEvent: на каждом в иерархии представлений, которая возвращает YES, иерархии, пока не найдет subview, в границах которого есть прикосновение. Это представление становится хитом-тестом.

и программирование iOS 5 Мэттом Нойбургом, стр .485, отметили, что если представление отмечено userInteractionEnabled как NO или hidden как YES, или непрозрачность близок к 0, тогда представление и его subview не будет проходить через HitTest (и поэтому не рассматривается для любого касания).

Ответ 3

Вы можете переопределить hitTest(_:withEvent:), чтобы игнорировать представление, но все равно доставляете касания к его представлениям.

class ContainerStackView : UIStackView {
    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
        let result = super.hitTest(point, withEvent: event)
        if result == self { return nil }
        return result
    }
}

Ответ 4

Первый метод

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
  if ([touch.view.superview isKindOfClass:[SuperViewParent class]]) return FALSE;
  return TRUE;
}

Второй метод

UITapGestureRecognizer *r = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(agentPickerTapped:)];
    r.cancelsTouchesInView = NO;
    [agentPicker addGestureRecognizer:r];