2009-02-21 6 views
21

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

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

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

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

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

ответ

29

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; 
     } 
    } 
} 
+1

Примечания для ясности: 1. цикл немного неудобно, так как вы проверить есть только один штрих. Обычный способ сделать это - сделать указатель на касание, используя [касается anyObject] или [касается objectAtIndex: 0]. 2. Вместо использования convertPoint: просто передайте «nil» в locationInView: в первую очередь. Это дает местоположение касания в системе координат окна, поэтому следующая строка является избыточной. – Rab

+1

Я знаю, что это довольно старые вопросы. Но только для тех, кому интересно. @Rab В большинстве случаев, кроме [касается объектаAtIndex: 0] NSset, который представляет собой набор касаний, не имеет селектора objectAtIndex. –

+0

+1 Хорошая точка @ Евгений Прокошев. Возможно, кто-то может помещать события касания в NSArray, но в этом случае у нас просто есть NSSet, который неиндексирован. Спасибо за разъяснение разъяснения. :) – Rab

1

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

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

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

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

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

+0

Большое спасибо ..... !! – Sarah

7

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

- (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... 
}