Я работал над Сенсорным приложением Какао и пытался обработать касания путем определения, какой подуровень слоя представления был затронут. Код моего контроллера был похож на это:
CALayer *hitLayer = [self.view.layer hitTest:point];
Это не работало. Это работало бы, если бы я коснулся в нижних частях подуровней, но не в вершинах. После часа получения по запросу волос и поиска с помощью Google, я наконец выяснил, что это работает, если Вы используете уровень представления, чтобы сделать тестирование хита вместо самого слоя:
CALayer *hitLayer = [self.view.layer.presentationLayer hitTest:point];
Так, я решил свою проблему, но мой вопрос: Почему?
Я прочитал Базовое руководство по Анимации, и я понимаю, что дерево презентации и дерево рендеринга могут отличаться от дерева объектной модели. Но я не понимаю, почему дерево презентации (по-видимому), имело бы другое тестирующее хит поведение. Не был бы дерево презентации и объектная модель имеют те же кадры, границы, и т.д.?
Согласно документация CALayer , кажется, есть разница между моделью и деревом представления относительно того, что представляется пользователю (в зависимости от текущей анимации). Для проверки попадания есть ссылка в методе presentationLayer
:
Например, отправка сообщения hitTest: в PresentationLayer запросит значения представления дерево слоев.
Поэтому я подозреваю, что только уровень представления имеет правильную геометрическую информацию для выполнения проверки попадания.