2014-09-12 2 views
1

UIPinchGeustureRecognizer를 사용하여 선을 그립니다. 모든 stackoverflow 솔루션을 사용해 보았지만 행운은 없었습니다. 이 문제를 해결하도록 도와주세요. 다음과 같은 오류가 발생했습니다UIPinchGeustureRecognizer를 사용하여 선 그리기

먼저 코드 논리가 올바른지 알고 싶습니다. 그리고 touchbegan/touchmoved에서 포인트를 얻지 못했습니다. (void) handleLinePinch : (UIPinchGestureRecognizer *) 제스처에서만 두 점을 얻습니다.

//My instances in .h file 

CGPoint location1,location2; 
LineView* l; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    l = [[LineView alloc]initWithFrame:self.view.frame]; 
    [self.view addSubview:l]; 
    UIPinchGestureRecognizer *linepinch = [[UIPinchGestureRecognizer alloc]  
    initWithTarget:l action:@selector(handleLinePinch:)]; 
    [l addGestureRecognizer:linepinch]; 
} 


- (void)handleLinePinch:(UIPinchGestureRecognizer *)gesture 
{ 
    NSUInteger num_touches = [gesture numberOfTouches]; 

    // save locations to some instance variables, like `CGPoint location1, location2;` 
    if (num_touches >= 1) { 
     location1 = [gesture locationOfTouch:0 inView:l]; 
    } 
    if (num_touches >= 2) { 
     location2 = [gesture locationOfTouch:1 inView:l]; 
    } 
    [l drawRect:location1 Loc2:location2]; 
    [l setNeedsDisplay]; 

} 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
} 


LineView.m 

- (void)drawRect:(CGPoint)location1 Loc2:(CGPoint)location2 { 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 5.0); 
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
CGFloat components[] = {0.0, 0.0, 1.0, 1.0}; 
CGColorRef color = CGColorCreate(colorspace, components); 
CGContextSetStrokeColorWithColor(context, color); 
CGContextMoveToPoint(context, location1.x, location1.y); 
CGContextAddLineToPoint(context, location2.x, location2.y); 
CGContextStrokePath(context); 
CGColorSpaceRelease(colorspace); 
CGColorRelease(color); 
} 

답변

2

당신은 UIView를 서브 클래스와 drawRect: 메소드를 오버라이드 (override) 할 필요, 당신은 UIGraphicsGetCurrentContext으로 얻을 CGContextRefdrawRect: 방법 중 무효이며이 호출 사이에 변경할 수 있기 때문에 그래픽 컨텍스트에 대한 강한 참조를 설정하지 않는다 drawRect : 메서드.

핀치 제스처를 인식하면 CGPoint를 뷰에 전달하고 setNeedsDisplay 메서드를 전달합니다.

항상 setNeedsDisplay을 사용하여보기를 새로 고치려면 drawRect:을 직접 보내지 마십시오.

LineView.m

- (void)drawRect:(CGRect)rect 
{ 
    // p1 and p2 should be set before call `setNeedsDisplay` method 
    [self drawRect:location1 Loc2:location2] ; 
} 

- (void)drawRect:(CGPoint)location1 Loc2:(CGPoint)location2 { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, 5.0); 
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
    CGFloat components[] = {0.0, 0.0, 1.0, 1.0}; 
    CGColorRef color = CGColorCreate(colorspace, components); 
    CGContextSetStrokeColorWithColor(context, color); 
    CGContextMoveToPoint(context, location1.x, location1.y); 
    CGContextAddLineToPoint(context, location2.x, location2.y); 
    CGContextStrokePath(context); 
    CGColorSpaceRelease(colorspace); 
    CGColorRelease(color); 
} 

편집 : 나는 두 손가락가있는 경우에만 선을 그어야 가정합니다.

- (void)handleLinePinch:(UIPinchGestureRecognizer *)gesture 
{ 
    NSUInteger num_touches = [gesture numberOfTouches]; 

    // save locations to some instance variables, like `CGPoint location1, location2;` 
    if (num_touches == 2) { 
     location1 = [gesture locationOfTouch:0 inView:l]; 
     location2 = [gesture locationOfTouch:1 inView:l]; 
    } 
    // you need save location1 and location2 to `l` and refresh `l`. 
    // for example: l.location1 = location1; l.location2 = location2; 
    [l setNeedsDisplay]; 

} 
+0

여기서부터 내가 업데이트 된 location1 및 location2 값을 읽었습니까? 나는 touchesBegan/Moved 또는 (void) handleLinePinch을 의미합니까? 'handleLinePinch :'의 – user3714144

+0

@ user3714144. – KudoCC

+0

나는 그 일을 잘 해냈다. 그 일은 선을 끌기 위해 그려진 선을 어떻게 감지 할 수 있는가이다. – user3714144