В iOS, если супервизор userInteractionEnabled равен NO, тогда все subviews также отключены?
Я подумал, что когда взгляд коснулся или постучал, его обработчик сначала вызывается, а затем вызывается его обработчик супервизора (распространяется вверх).
Но верно ли, что если для супервизора userInteractionEnabled
установлено значение НЕТ, то все подзаголовки и потомство также отключены для взаимодействия с пользователем? Что делать, если мы хотим отключить только основной вид, но не хотим отключать его для просмотра?
Ответы
Ответ 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];