CALayer не может напрямую реагировать на сенсорные события, но многие другие объекты в вашей программе могут, например, UIView, который содержит слои.
События, такие как событие, которое генерируется системой при прикосновении к экрану, отправляются через так называемую «цепочку респондента». Поэтому при касании экрана сообщение отправляется (другими словами - вызывается метод) в UIView, который находится в месте касания. Для касаний есть три возможных сообщения: touchesBegan:withEvent:
, touchesMoved:withEvent:
и touchesEnded:withEvent:
.
Если это представление не реализует метод, система попытается отправить его в родительское представление (суперпредставление на языке iOS). Он пытается отправить его, пока он не достигнет вид сверху. Если ни одно из представлений не реализует метод, оно пытается быть доставлено текущему контроллеру представления, затем его родительскому контроллеру, а затем объекту приложения.
Это означает, что вы можете реагировать на сенсорные события, реализуя упомянутые методы в любом из этих объектов. Обычно наилучшими кандидатами являются хостинг-представление или текущий view-контроллер.
Допустим, вы реализуете это в представлении. Следующая задача - выяснить, какие слои были затронуты, для этого вы можете использовать удобный метод convertPoint:toLayer:
.
Например, вот как это может выглядеть в контроллере вида:
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
CGPoint p = [(UITouch*)[touches anyObject] locationInView:self.worldView];
for (CALayer *layer in self.worldView.layer.sublayers) {
if ([layer containsPoint:[self.worldView.layer convertPoint:p toLayer:layer]]) {
// do something
}
}
}