не могу заставить CALayer содержит Point для работы - PullRequest
1 голос
/ 07 июля 2011

У меня есть массив CALayers, содержащий изображения, которые может перемещать пользователь, и я пытаюсь использовать containsPoint, чтобы обнаружить, если они были затронуты - код выглядит следующим образом:

int num_objects = [pageImages count];

lastTouch = [touch locationInView:self];

CGRect objRect;
CALayer *objLayer;

for (int i = 0; i < num_objects; i++) {

    objLayer = [pageImages objectAtIndex:i];
    objRect = objLayer.bounds;

    NSLog(@"layerPos:%@, layerBounds:%@", NSStringFromCGPoint(objLayer.position), NSStringFromCGRect(objRect));
    NSLog(@"point:%@", NSStringFromCGPoint(lastTouch));

    if ([objLayer containsPoint:lastTouch] == TRUE) {
        NSLog(@"touched object %d", i);
        return i;
    }
}

Информация, которую я вывожу, помещает касание в границы слоя (я предположил, что положение - это центр слоя, я не изменил опорную точку. Слой не был повернут или что-то подобное что либо), но содержит Point: не возвращает true. Может кто-нибудь увидеть, что я делаю неправильно, или предложить другой / лучший способ добиться того, чего я хочу?

1 Ответ

8 голосов
/ 08 июля 2011

Итак .. нашел проблему - точку необходимо преобразовать из координат суперслоя, чтобы работа со слоем содержит Point:

заменить

if ([objLayer containsPoint:lastTouch] == TRUE) {

с

if ([objLayer containsPoint:[objLayer convertPoint:lastTouch fromLayer:objLayer.superlayer]] == TRUE) {

Вы можете возиться с координатами самостоятельно и использовать CGRectContainsPoint: (см. Комментарии выше), но это более простое решение, поэтому я впервые отвечаю на свой вопрос. большая галочка для меня, ууу!

...