hitTest на CALayer - как узнать, какой именно слой был поражен? - PullRequest
4 голосов
/ 24 ноября 2011

Ситуация: нужно найти слой, к которому прикоснулся пользователь.

Проблема: Apple говорит, что мы должны использовать [CALayer presentationLayer] для тестирования попаданий, чтобы он представлял то, что на самом деле отображается на экране в данный момент (он захватывает информацию в середине анимации и т.д.).

... за исключением: presentationLayer НЕ возвращает исходные слои, он возвращает их копии ... итак: hitTest вернет совершенно новый экземпляр CALayer, который не эквивалентен оригиналу.

Как мы узнаем, какой фактический CALayer был поражен?

, например

CALayer* x = [CALayer layer];
CALayer* y = [CALayer layer];
[self.view.layer addSublayer: x];
[self.view.layer addSublayer: y];

...

CALayer* touchedLayer = [self.view.layer.presentationLayer hitTest:touchPoint];

... но, тронут ли слой "x", или это "y"?

if( touchedLayer == x ) // this won't work, because touchedLayer is - by definition from Apple - a new object

Ответы [ 2 ]

7 голосов
/ 01 апреля 2013

Адам ответил правильно и помог мне.Вот код, который я использовал, который может помочь кому-то еще.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint touchPoint = [(UITouch*)[touches anyObject] locationInView:self];
    CALayer *touchedLayer = [self.layer.presentationLayer hitTest:touchPoint];  // is a copy of touchedLayer
    CALayer *actualLayer = [touchedLayer modelLayer];   // returns the actual layer
    NSLog (@"touchedLayer: %@", touchedLayer);
    NSLog (@"actualLayer: %@", actualLayer);
}
3 голосов
/ 24 ноября 2011

Ах!Просто понял это, читая сообщение в списке рассылки о другой проблеме с CALayer.

После вызова [CALayer presentationLayer] и работы с «клоном презентации» дерева слоев вы можете взять любой объект вэто дерево, и вызовите [CALayer modelLayer] для него, чтобы вернуть исходный ссылочный объект в той же позиции в исходном дереве .

Эта ссылка стабильна (проверено - работает).

Документы Apple немного ... неясны ... по этому вопросу.И они подразумевают, что это "иногда" не удастся (" ... результаты не определены ") - но пока мне этого достаточно.

...