2012-01-18 2 views
1

UIView에는 CALayers 수가 있습니다. 각 CALayer는 CAShapeLayers로 구성됩니다. CAShapeLayers의 경로 속성은 UIBezierPath로 구성됩니다.서브 클래 싱을 사용하는 사용자 정의 CALayer

내 목표는 내가 CALayer를 탭할 때 UIBezierPath의 그림에서 사용한 점을 얻고 싶습니다. 그 점을 저장 NSMutableArray있는 CALayer subclassing 생각했다. 나는 특히 CALayer에서 드로잉 할 때 포인트를 저장할 것입니다. 그래서 언제든지 특정 CALayer를 탭하면 그 점과 관련된 점을 얻을 수 있습니다. 또한 나는 각 CALayer에게 태그를주고 싶다. 나는 이것을 어떻게하는지 모른다.

두 번째 방법은 CALayer에서 캡처 한 포인트를 제공하는 CALayer의 inbuilt 속성을 사용하는 것입니다. 그러나 나는 이런 종류의 재산을 알지 못합니다.

이 작업을 수행하는 방법을 알려주십시오.

답변

2

터치 이벤트를 처리하기 위해 CALayer가 포함 된 UIView를 사용해야하며 CALayers의 Touch 이벤트는 내장되어 있지 않습니다. - (CALayer *)hitTest:(CGPoint)thePoint은 터치 이벤트의 포인트가있는 "가장 깊은"CALayer를 반환합니다. 당신이 [self.layer hitTest:point]를 호출하는 경우 그래서, 그것은 모든 하위 레이어를 확인하고 CGPath 당신이 그것으로 공급되는 점에서 얻을 수있는 방법은 없습니다 올바른 CALayer

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    CGPoint point = [[touches anyObject] locationInView:self]; 
    CALayerSubclass *taplayer = [self.layer hitTest:point] 
    NSArray *points = [taplayer getPoints]; 
} 

반환합니다. 경로에서 정보를 가져 오는 것에 대한 최선의 답변은 these methods입니다. 그래서, 말했듯이, 최선의 방법은 CALayer를 서브 클래스 화하고 필요한 모든 정보를 나중에 검색하기 위해 데이터 구조에 넣는 것입니다.

// .h 
@interface CALayerSubclass : CALayer 

@property (nonatomic, strong) NSMutableArray *points; 

@end 

// .m 
-(void)drawInContext:(CGContextRef)ctx { 
    ... 
    [bezierPath addCurveToPoint:controlPoint1:point1 controlPoint2:point2]; 
    [points addObject:[NSValue valueWithCGPoint:point1]]; 
    [points addObject:[NSValue valueWithCGPoint:point2]]; 
    ... 
} 

그냥 NSValue 모든 CGPoints (또는 대부분의 다른 코어 그래픽 구조)를 저장하고 배열로 던져.

+0

실제로 경로 그림이 들어있는 CALayer에서 모든 점을 검색하려고합니다. 그렇게하는 방법? – Harsh

+0

죄송합니다. 죄송합니다. 귀하의 질문을 읽지 마십시오. 희망하는 나의 편집 도움. – Kevin

+0

-drawInContext :는 CAShapeLayer에서 호출되지 않습니다. –

관련 문제