使用UIPinchGestureRecognizer绘制线条

时间:2014-09-12 15:14:08

标签: objective-c ios7 line uibezierpath

我想使用UIPinchGeustureRecognizer绘制线条,我已经尝试了所有stackoverflow解决方案,但没有运气。请帮我解决这个问题。我收到了以下错误

首先,我想知道我的代码逻辑是否正确。我没有从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);
}

1 个答案:

答案 0 :(得分:2)

您必须创建UIView的子类并覆盖drawRect:方法,CGContextRef使用UIGraphicsGetCurrentContext的{​​{1}}无法使用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];

}