CALayer -hitTest: не соблюдается Содержит Point: перегрузка - PullRequest
1 голос
/ 30 сентября 2010

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

- (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 бомбы вместо того, чтобы проходить через него.

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

Ответы [ 2 ]

2 голосов
/ 30 сентября 2010

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

- 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:

0 голосов
/ 30 сентября 2010

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

- UIView.layer --------- gameLayer 
           |                |
     dragObj(bomb)     gameElements
                            |
                           bomb
...