Я добавляю несколько объектов UIView
(например, 5) к экрану, один внутри другого. Это, например, view5.superview = view4
, view4.superview = view3
, view3.superview=view2
, view2.superview = view1
. Для всех этих UIView
я устанавливаю uitapgesturerecognizer; для view1-4 Я просто делаю NSLog (@ "tap% @", self) в обратном вызове, тогда как для view5 tap я устанавливаю следующее: удаляю view4 из иерархии, затем помещаю тот же объект view4 'в то же место иерархии, Этот объект также содержит view5 ', для которого установлен UITapGestureRecognizer
(практически, я заменяю одну часть разметки на аналогичную).
Затем я нажимаю на view5. Некоторое время view5 продолжает ловить краны и все в порядке, но случайное количество кранов позже (каждый раз, когда этот номер отличается), один из объектов view1-4 начинает ловить этот кран, хотя мы все еще нажимаем на view5. Вся проблема имеет случайный характер - иногда это происходит на 10-м запуске, иногда на втором. Иногда неправильные объекты начинают захватывать краны при первом касании. Также я никогда не знаю, какой объект поймает кран, когда все пойдет не так. Кадр для представления (n + 1) был установлен, например, как половина кадра (n) кадра, тогда как кадр для представления 1 - например, (0,0 320, 460).
Все операции с объектами ui, описанные выше, ведутся в основном потоке, и все, что я рассказывал, отлично работает на iOS 4.3 - 6.1 с гораздо более сложными примерами. Но iOS7 делает из него какой-то случайный ад.
Update: Я создал образец проекта, чтобы упростить процесс отладки. Не добавлять/удалять операции подсмотра при нажатии. Только 4 вида на экране, при нажатии приложения регистрирует, какой вид был использован. Итак, вам нужно нажать на самый маленький вид (4). Если вы видите, что "нажмите 4 tap 4 tap 4..." в журнале - это тот случай, когда все работает нормально, останавливается и запускается снова, останавливается и запускается снова, останавливается и запускается снова и т.д. И при некоторых прогонах (возможно, после 10 + успешные прогоны), вы не увидите "tap 4" в первой строке, вы увидите "tap 1" или "tap 2" или "tap 3", и это будет продолжаться так - это плохие случаи.
Пример проекта можно скачать здесь: http://tech.octopod.com/test/BuggySample.zip (всего 33 Kb в архиве).
Обновление 2
Мы отправили ошибку в Apple, я опубликую здесь, когда мы получим обратную связь. Однако любое хорошее обходное решение было бы высоко оценено!
Обновление 3
Решение, представленное Ювразином, действительно работает над образцовым проектом. К сожалению, он по-прежнему не помогает решить проблему, возникшую в основном проекте, где он изначально появился. Основная причина заключается в том, что если какой-либо вид без собственного жеста лежит на кликабельном содержимом, элемент случайного представления под ним начинает захватывать взаимодействие (а не верхнее с набором жестов взаимодействия). Есть ли у вас идеи, как это можно решить? Обновленный образец можно загрузить здесь: http://tech.octopod.com/test/BuggySample2.zip