2009-02-21 6 views
21

저는 iPhone SDK를 처음 사용합니다. 지금은 CALayers로 프로그래밍하고 있는데, UIViews만큼 비싸지 않고 OpenGL ES 스프라이트보다 코드가 적습니다.CALayer에서 터치 이벤트를 얻는 방법?

이 질문이 있습니다. CALayer에서 터치 이벤트를받을 수 있습니까? 나는

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

와의 UIView에 터치 이벤트를 얻을하는 방법을 이해하지만, 오렌지색 사각형이 3D 공간에 떠 어디서나 예를 들면,있는 CALayer 객체에 터치 이벤트를 얻을하는 방법에 대한 찾을 수 없습니다. 나는 이것이 내가 궁금해하는 유일한 사람이라고 믿지 않는다.

감사합니다.

답변

29

확인 - 내 질문에 답변했습니다. 뷰 컨트롤러의 메인 레이어에 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. for 루프는 단 한 번의 터치 만 있었기 때문에 조금 어색합니다. 이 작업을 수행하는 일반적인 방법은 [touches anyObject] 또는 [touches objectAtIndex : 0]을 사용하여 터치 포인터를 만드는 것입니다. 2. convertPoint :를 사용하는 대신, 처음에는 locationInView :에 "nil"을 전달하십시오. 이렇게하면 창 좌표계에서 터치 위치가 지정되므로 다음 줄이 중복됩니다. – Rab

+1

나는 이것이 꽤 오래된 질문이라는 것을 알고있다. 그러나 호기심 많은 사람들을 위해서. @Rab 거의 [touches objectAtIndex : 0]을 제외하고는 touches의 집합을 나타내는 NSset에는 objectAtIndex selector가 없습니다. –

+0

+1 좋은 지적 @EugeneProkoshev. 누군가가 터치 이벤트를 NSArray에 넣을 수도 있지만,이 경우에는 색인화되지 않은 NSSet 만 있습니다. 설명을 명확히 해 주셔서 감사합니다. :) – Rab

1

내가

point = [[touch view] convertPoint:point toView:self.view]; 
로 변경했다 내가

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

으로 잘못된 좌표를 얻는 것을 발견

정확한 레이어를 얻으려면

+0

고맙습니다 ..... !! – Sarah

7

첫 번째 답변과 비슷합니다.