У меня есть собственный UIControl
, содержащий еще несколько элементов управления. Между этими элементами управления есть пустое пространство, и фон моего UIControl
должен быть прозрачным.
Мне нужно перехватить все события касания, которые происходят в моем пользовательском UIControl
, даже если они происходят только между другими элементами управления (над прозрачными областями). Я не могу использовать распознаватели жестов, мне нужно больше контроля, чем они предоставляют. Вместо этого я хотел бы зарегистрировать такие функции обработки касаний:
myControl.addTarget(self, action: "handleTouchDown:event:", forControlEvents: UIControlEvents.TouchDown)
При таком подходе я получаю штрихи, которые случаются с непрозрачными областями myControl
, но не те, которые происходят на прозрачном фоне.
Я попытался переопределить hitTest::point:withEvent
в моем пользовательском элементе управления, чтобы не проверять альфа-значение. Но hitTest::point:withEvent
даже не вызывается, когда прикосновение происходит к прозрачной области управления. Я заменил свой элемент управления layer
на пользовательский CALayer
и переопределил hitTest
и для него, но без результата (hitTest
на уровне, похоже, не вызывается вообще).
Подробнее (РЕДАКТИРОВАТЬ)
Все, что вам нужно сделать, чтобы дать идеальный ответ (и выиграть награду), это:
- Создайте простое приложение, добавьте одно
UIControl
(например,UIButton
). - Удалите все содержимое из
UIControl
(текст изUIButton
) и сделайте его фон прозрачным (либо установите чистый цвет, либо установите альфа-канал на 0). - Используйте метод
addTarget::action:forControlEvents:
для регистрацииUIControlEvents.TouchDown
событий в элементе управления. В методе обработчика выведите что-нибудь на консоль. - Запускаем приложение, нажимаем элемент управления. На консоль ничего не выводится. Сделайте так, чтобы это работало - не используйте распознаватели жестов. Мне нужна детализация, обеспечиваемая
addTarget::action:forControlEvents:
. Никакие хакерские решения не предпочтительны. Я знаю, что установка фонового альфа-канала на элементе управления на0.01
заставит его работать внезапно, но это своего рода хакерство, которого я не хочу. Опишите здесь, что вы сделали.
UIControl
на какой-то цвет с альфа-каналом0.01
, все будет работать нормально, я получу все события касания, которые мне нужны. Но это взлом, и он влияет на цвета представлений, которые находятся за этим прозрачным элементом управления. - person Rasto   schedule 30.10.2014view.backgroundColor = [UIColor clearColor]
? - person Michael   schedule 30.10.2014UIControl
находится на нужном месте в иерархии представлений? Проверьте порядок иерархии представлений. - person Michael   schedule 30.10.2014UIControl
, чтобы сделать его полностью прозрачным, и попробуйтеaddTarget
зарегистрироваться для некоторых штрихов. Она не будет работать. Просто глупо по замыслу ... - person Rasto   schedule 30.10.2014UIControl
и заметил ту же проблему. Я также пробовалhitTest:Point:withEvent
согласно this SO post, он также не работал должным образом. Возможно, вы можете установить белый цвет фона и очень низкое значение альфа-канала? Или даже попробоватьUIButton
? - person Michael   schedule 30.10.2014- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
вы можете точно указать, где жест будет передан распознавателю. Не могли бы вы указать только вид вашего элемента управления для получения касания? (и откажитесь от касания, если оно касается одного из ваших субконтроллеров.) - person Tim Quinn   schedule 31.10.2014