2013-06-17 10 views
0

감사합니다 :아이폰 OS : CAShapeLayer,의 CALayer 마스크, 그러나 hitTest : WithEvents는, 그러나 hitTest : 사전에

이 내의 UIView 내가 설정 : CALayer * layer = (CALayer*) self.layer

그리고이 클래스 I 내에서 내가보기이 같은 계층 구조를 가지고 CAShapeLayer이 있으며 CALayer의 마스크로 설정되어 있습니다.

잘 생기고 아무런 문제가 없습니다.

나는에 의해 위의 UIView을 초기화하기 UIViewController 있습니다

myView = [myAnimationView alloc] initWithFrame:(CGRect){{0, 0}, 320, 450}]; [self.view addSubview myView];

그래서 내가 가지고있는 것은하십시오 UIView 클래스와 위 UIViewController 클래스입니다. 다른 건 없어. CAShapeLayer 애니메이션으로

는 (그것이 더 큰 하나에 작은 원에서 확장 만 기본 CA 애니메이션이다), 나는 점검이 UIView

을 inits 그 UIViewController 내에서 터치 포인트를 얻을 수 있도록 노력하겠습니다 hitTest 사용 : WithEvents : 여기? 나는 그것을 시도했지만 세 번이나 불려진다. 반환 된 포인트는 정확하지만 애니메이션 뷰가 컨테이너 뷰에서 터치되는지 여부를 알 수있는 방법을 찾고 싶습니다. 다른 말로하면, 나는 subView/subLayer가 만져지고 있는지 알고 싶습니다.

UIViewControllerUIView 클래스를 초기화하고 하위 뷰를 같이 추가합니다 : 요약

, 여기 내 뷰 계층이다. 이 클래스는 UIView 층내 는 CALayer * layer = (CALayer *) self.layer 의해 CALayer을로 설정되고 CAShapeLayerCALayer의 마스크로 설정하고, 애니메이션 형태 층의 경로를 설정한다.

그리고 그 계층에서 CALayer을로 설정되어 뷰 내에서 CAShapeLayer에 의해 애니메이션되고있는 계층에서 터치 포인트를 얻을하는 것이 가능 레이어가 UIViewController

내에서 감동을 얻을 수에 싶습니다 Subview로 추가하는 UIViewController? 예를 들어 설명해주십시오.

대단히 감사드립니다. 문안 인사.

답변

0

생각해 보면 CALayer은 터치 이벤트를 수신/처리하도록 설계되지 않았습니다 (이는 UIView과 큰 차이가 있습니다). 나는 하나주의해야 할 점은 그러나있다

- (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer { 
    CGPoint currentPoint = [recognizer locationInView:self.overlayView]; 
    bool didSelect = [self selectPathContainingPoint:currentPoint]; 
    if (didSelect) { 
     [self updateViews]; 
    } 
} 

- (BOOL)selectPathContainingPoint:(CGPoint)point { 
    CALayer * layer = (CALayer *) self.layer; 
    CAShapeLayer *mask = (CAShapeLayer *)layer.mask; 
    return CGPathContainsPoint(mask.path, nil, point); 
} 

처럼 뭔가와의 ViewController에서 CAShapeLayer.path 내에서 (길게 누름) 터치 테스트 : 내 길 애니메이션되지 않습니다. CAShapeLayer에 대한 문서에서 애니메이션 도중 CAShapeLayer.path 속성이 업데이트되면 아무 내용도 표시되지 않습니다.이 같은

0

시도 뭔가 :

- (void)setup 
{ 
    _maskLayer = [CAShapeLayer layer]; 
    _maskLayer.fillColor = [UIColor whiteColor].CGColor; 
    _maskLayer.path = somePath; 

    _theLayer.frame = CGRectMake(0, 0, size.width, size.height); 

    // Apply a mask 
    _maskLayer.frame = _theLayer.frame; 
    _theLayer.mask = _maskLayer; 
} 

- (IBAction)tapOnView:(UITapGestureRecognizer *)sender 
{ 
    CGPoint point = [sender locationInView:theView]; 
    CALayer *subLayer = [_theLayer.presentationLayer hitTest:point].modelLayer; 

    if (subLayer != _theLayer && subLayer != nil) { 
     // Do something with the sublayer which the user touched 
    } 
} 

당신은 설정하여 TapGestureRecognizer 할 것이다, 나는이 사용하는 인터페이스 빌더를했지만 당신이 원하는 경우에 당신은 코드에서 그것을 할 수 있습니다. 레이어에 적절한 경계가 설정되어 있는지 확인하고 마스크의 경계를 설정해야합니다.

프리젠 테이션 레이어를 가져와 실제 레이어로 다시 변환하는 중입니다. 이로 인해 애니메이션과 함께 작동합니다.

이 정보가 도움이되기를 바랍니다.