Подтвердить что ты не робот

Как получить событие касания на CALayer?

Я новичок в iPhone SDK. Прямо сейчас я программирую CALayers, который мне очень нравится - не так дорого, как UIViews, и намного меньше кода, чем спрайты OpenGL ES.

У меня есть вопрос: возможно ли получить событие касания на CALayer? Я понимаю, как получить событие касания на UIView с помощью

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

но я не могу найти нигде о том, как получить событие касания на объекте CALayer, например, оранжевый квадрат, плавающий в трехмерном пространстве. Я отказываюсь верить, что я единственный, кто интересуется этим.

Я ценю любую помощь!

4b9b3361

Ответ 1

ok- ответил на мой вопрос! скажем, у вас есть куча CALayers в главном слое контроллера вашего вида, и вы хотите, чтобы они доходили до непрозрачности 0.5, когда вы касались их. реализовать этот код в .m файле вашего класса контроллера вида:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if ([touches count] == 1) {
        for (UITouch *touch in touches) {
            CGPoint point = [touch locationInView:[touch view]];
            point = [[touch view] convertPoint:point toView:nil];

            CALayer *layer = [(CALayer *)self.view.layer.presentationLayer hitTest:point];

            layer = layer.modelLayer;
            layer.opacity = 0.5;
        }
    }
}

Ответ 2

Как и в первом ответе.

- (CALayer *)layerForTouch:(UITouch *)touch {
    UIView *view = self.view;

    CGPoint location = [touch locationInView:view];
    location = [view convertPoint:location toView:nil];

    CALayer *hitPresentationLayer = [view.layer.presentationLayer hitTest:location];
    if (hitPresentationLayer) {
        return hitPresentationLayer.modelLayer;
    }

    return nil;
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CALayer *hitLayer = [self layerForTouch:touch];

    // do layer processing...
}

Ответ 3

Я обнаружил, что получаю неправильные координаты с помощью

point = [[touch view] convertPoint:point toView:nil];

Мне пришлось изменить его на

point = [[touch view] convertPoint:point toView:self.view];

Чтобы получить правильный слой