Как передать сенсорное событие для просмотра, когда userInteractionEnabled = ДА?

У меня есть следующая настройка.

+- XXXCustomControl : UIControl -------+ | A | | +- ContentView -------------------+| | | || | | B || | | || | +---------------------------------+| +--------------------------------------+ 

XXXCustomControl, который является подклассом UIControl. Он содержит одно подназвание под названием contentView типа UIView с размером, меньшим, чем область Control. Этот вид имеет .userInteractionEnabled = YES;

Мне нужно, чтобы это свойство было установлено в YES, поскольку горизонтальные прокрутки отображаются в нем один раз в то время, и они должны быть прокручиваемыми. Если супервизор (в нашем случае просмотр содержимого не позволит взаимодействовать с пользователем, это унаследовано у подзонов.) Но в то же время этот XXXCustomControl должен быть доступен, если он не содержит прокрутки в своем представлении контента не только в области A, но также в области B.

Поэтому у меня есть «конфликт интересов», потому что я либо

1) задайте представление содержимого userInteractionEnabled = NO, затем я могу нажать пустой элемент управления в области просмотра содержимого как в A, так и на B, но прокрутки, которые я поставлю там, не будут прокручиваться.

2) задайте представление содержимого userInteractionEnabled = YES, но затем, если элемент управления пуст, я могу только коснуться области A, чтобы вызвать событие касания.

Одна из идей, которую я придумал, заключается в том, что я установил свойство NO по умолчанию, и когда я заполняю ContentView, я установил его в yes. когда я очищаю ContentView, я возвращаю свойство обратно в no. В основном, я хочу, чтобы это всегда было настроено на yes, а когда оно пустое, заставьте contentView передать событие touchUpInside до его супервизора.

Это возможно?

Вы можете попытаться переопределить метод pointInside:withEvent: в вашем внутреннем виде. Это позволит вам возвращать NO, когда вы хотите перенаправить касания в супервизор:

 -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { if( /* You have content, and you want to receive touches */){ return YES; }else{ return NO; } } 

Вы можете подклассифицировать свое подчинение и реализовать

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (!touchedContent) { [[self nextResponder] touchesBegan:touches withEvent:event]; } else { [super touchesBegan:touches withEvent:event]; } } 

Вы можете использовать другой UIView для «скрытия» подвью.

* Подробности: Этот UIView является дочерним подразделением subview. он имеет тот же размер и положение вашего подсмотра с цветом фона четкого цвета.

* Объясните: новый UIView примет осязание и автоматически передаст его в супервизор.

Таким образом, не нужно подклассифицировать ваш subview – это решение для раскадровки.
Пожалуйста, попробуйте это. Повеселись!

  • Предупреждение о раскадровке Xcode: привязка объектов привязки, отключенных в текущей конфигурации. Отключите это ограничение в текущей конфигурации
  • Как узнать, какой другой UIScrollView вмешивается в scrollsToTop?
  • UIControlEventTouchDragExit запускает, когда 100 пикселей от UIButton
  • Непризнанная ошибка выбора для isEqualToString: при настройке текста метки
  • Каково стандартное соглашение о создании нового NSArray из существующего NSArray?
  • Нажатие кнопки на панели навигации вызывает щелчок по нажатию на область под ней.
  • Установите эксклюзивное касание нескольких UIView того же класса
  • UIScrollView - возврат в исходное положение без привязок
  • Скрыть UIButton при нажатии другой кнопки
  • UITableViewCell с UITextField теряют возможность выбора строки UITableView?
  • leftbarbuttonitem не отображается в навигационной панели
  • Давайте будем гением компьютера.