2014-06-21 2 views
4

내가 uibezierpath

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef contextRef = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(contextRef, 2.0); 
    CGContextSetRGBFillColor(contextRef, 0, 0, 1.0, 1.0); 
    CGContextSetRGBStrokeColor(contextRef, 0, 0, 1.0, 1.0); 
    CGRect circlePoint = (CGRectMake(self.bounds.size.width/3, self.bounds.size.height/2, 200.0, 200.0)); 

    CGContextFillEllipseInRect(contextRef, circlePoint); 
} 

UIView의

의 서브 클래스에서의 drawRect 함수에서 원을 그리기하고 나는 그것이 tappable 수 있도록 원에 제스처 인식기를 추가 할에 의해 그려진 모양 제스처 인식기를 추가하는 방법
UITapGestureRecognizer *singleFingerTap = 
[[UITapGestureRecognizer alloc] initWithTarget:self 
             action:@selector(handleSingleTap:)]; 
[self.view addGestureRecognizer:singleFingerTap]; 

나는 큰 원이 될 위치에 (스토리 보드) 뷰 위에 UIGestureRecognizer을 끌어 생각하지만 원은 UIGestureRecognizer 위젯보다 훨씬 크다.

코드를 결합하거나 UIGestureRecognizer를 원의 크기와 위치와 정확히 같은보기 영역에 할당하려면 어떻게해야합니까?

답변

1

당신이 drawRect를 사용하는 방법을 잘 모르겠지만 UIBezierPath를 사용하여 비슷한 작업을 수행했습니다. UIView를 서브 클래 싱하여이 뷰를 내 컨트롤러의 기본 뷰로 만들었습니다. 이보기의 코드입니다.

- (id)initWithCoder:(NSCoder *)aDecoder { 

    if (self = [super initWithCoder:aDecoder]) { 
     self.shape = [UIBezierPath bezierPathWithOvalInRect:(CGRectMake(self.bounds.size.width/3, self.bounds.size.height/3, 200.0, 200.0))]; 
     } 
    return self; 
} 

-(void)drawRect:(CGRect)rect { 
    [[UIColor blueColor] setFill]; 
    [self.shape fill]; 
} 

모양은 .h 파일에 선언 된 속성입니다. 뷰 컨트롤러하는 .m 파일에서, 나는

@interface ViewController() 
@property (strong,nonatomic) RDView *mainView; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.mainView = (RDView *)self.view; 
    UITapGestureRecognizer *singleFingerTap = 
    [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
    [self.view addGestureRecognizer:singleFingerTap]; 
} 

-(void)handleSingleTap:(UITapGestureRecognizer *) tapper { 
    if ([self.mainView.shape containsPoint:[tapper locationInView:self.mainView]]) { 
     NSLog(@"tapped"); 
    } 
} 
+0

감사합니다. .h 파일에 "self.shape"유형은 무엇입니까? – Leahcim

+0

@Leahcim, "@property (strong, nonatomic) UIBezierPath * 모양; – rdelmar

+0

감사합니다. UIBezierPath에 대해 알고 있어야합니다. – Leahcim

2

짧은 대답은 당신이 할 수없는 것입니다, 제스처 인식기를 추가하고, 터치 모양 안에 있는지 확인하세요. 제스처 인식기는 모양이나 레이어가 아닌보기에 첨부됩니다. 각 도형에 대한 사용자 정의 뷰 객체를 만들어야합니다. 당신은 확실히 그것을 할 수 있습니다.

내가 제안하는 것은 모든 모양을 관리하는 UIView의 사용자 지정 하위 클래스를 만드는 것입니다. (ShapesView라고 부름) 사용자 정의 ShapesView가 사용자 정의 모양 객체의 배열을 관리하도록하십시오. 제스처 인식기를 ShapesView에 연결합니다. 제스처에 응답하는 코드에서 사용자 지정 히트 테스트를 수행하여 도형을 확인한 다음 도형을 이동합니다.

UIBezierPath에는 각 도형에 대해 베 지어 경로를 유지 관리하는 경우 적중 테스트를 수행 할 수있는 containsPoint 메서드가 포함되어 있습니다.

+0

감사합니다. 제스처에 응답하는 원이 하나만 필요합니다. – Leahcim