使用UIPinchGeustureRecognizer绘制线条

问题描述:

我想使用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); 
} 

你必须继承的UIView并覆盖drawRect:方法,你UIGraphicsGetCurrentContext得到CGContextRef无效出来drawRect:方法,并没有建立一个强有力的参考图形上下文,因为它可以调用之间改变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或from(void)handleLinePinch?来自'handleLinePinch:'的 – user3714144 2014-09-17 07:17:25

+0

@ user3714144。 – KudoCC 2014-09-17 07:49:40

+0

我已经完成了,它的工作正常..事情是如何检测绘制线拖动线。 – user3714144 2014-09-18 06:26:52