CALayer -hitTest: не соблюдая containsPoint: перегрузка

Вернемся снова и у вас есть другой вопрос с той же функцией, которую я опубликовал ранее:

- (AIEnemyUnit *) hitTestForEnemyUnit:(CGPoint)where {
    CALayer * layer = [self hitTest:where];

    while (layer) {
        if ([layer isKindOfClass:[AIEnemyUnit class]]) {
            return (AIEnemyUnit *)layer;
        } else {
            layer = layer.superlayer;
        }
    }

    return nil;
}

У меня есть бомба, которую пользователь перетаскивает поверх врага, чтобы она отображалась прямо над AIEnemyUnit. Для этой бомбы я реализовал CALayer -containsPoint:, чтобы возвращать NO во время перетаскивания, чтобы разрешить -hitTest: пройти через слой. В основном этот тип проверки попадания отлично работал с этими «сквозными» слоями, пока я использовал только контексты CGImageRef. Однако как только я начал применять подслои для дополнительных эффектов на бомбе, -hitTest: сразу сломался. Было очевидно, что новые слои захватывают -hitTest:. Я попытался реализовать ту же технику, перегрузив -containsPoint: для этих слоев, но он по-прежнему возвращал общий подкласс CALayer бомбы, а не проходил через него.

Есть ли способ лучше?


person Phil M    schedule 30.09.2010    source источник


Ответы (2)


Возможно, точка «где» не относится к вашему слою «я». Вам необходимо преобразовать эти точки между системами координат слоев, используя:

- convertPoint: fromLayer: или - convertPoint: toLayer:

См. http://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/convertPoint:fromLayer:

person mgratzer    schedule 30.09.2010
comment
Нет, точный код работал нормально без дополнительных слоев, а некоторые элементы довольно маленькие, поэтому я знаю, что where работало правильно. - person Phil M; 30.09.2010

Я решил эту проблему, разместив все на втором «корневом» слое (называемом «gameLayer») того же размера, что и оригинал. Затем во время UIPanGestureRecognizer я перемещаю элемент бомбы из «gameLayer» в свой UIView.layer. Затем, пока я тестирую AIEnemyUnit, я запускаю hitTest только на «gameLayer».

- UIView.layer --------- gameLayer 
           |                |
     dragObj(bomb)     gameElements
                            |
                           bomb
person Phil M    schedule 30.09.2010