UIGraphicsBeginImageContext没有绘制

时间:2013-07-04 06:16:28

标签: iphone ios uiview quartz-graphics drawrect

我想在我的视图中经常画线,但它不起作用。我不想使用drawRect,因为我必须保持先前绘制的行的状态。下面是线条图的代码。请指导。

- (void)drawPathWithPoints:(int)xAxis andYaxis:(int)yAxis
{    
    CGSize screenSize = drawingImgView.frame.size;

    UIGraphicsBeginImageContext(drawingImgView.frame.size);

    CGContextRef currentContext = UIGraphicsGetCurrentContext();
     [drawingImgView.image drawInRect:CGRectMake(0, 0, screenSize.width, screenSize.height)];

    CGContextSetLineCap(currentContext, kCGLineCapRound);
    CGContextSetLineWidth(currentContext, 9.0);
    CGContextSetRGBStrokeColor(currentContext, 0, 0, 1, 1);
    CGContextBeginPath(currentContext);

    CGMutablePathRef pointPath = CGPathCreateMutable();

    CGContextMoveToPoint(currentContext,xAxis,yAxis);

    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    pathAnimation.duration = 3.0;
    pathAnimation.delegate = self;
    pathAnimation.calculationMode = kCAAnimationPaced;
    pathAnimation.fillMode = kCAFillModeForwards;
    pathAnimation.removedOnCompletion = NO;

    CGPathMoveToPoint(pointPath, NULL, xAxis, yAxis);
    CGContextAddLineToPoint(currentContext, xAxis, yAxis);
    CGPathAddLineToPoint(pointPath, NULL, xAxis, yAxis);

    pathAnimation.path = pointPath;

    myLayer = [[CAShapeLayer alloc] init];
    myLayer.strokeColor = [[UIColor greenColor] CGColor];
    myLayer.lineWidth = 11.0;
    myLayer.fillColor = nil;
    myLayer.lineJoin = kCALineJoinBevel;
    myLayer.path = pointPath;
    [drawingImgView.layer addSublayer:myLayer];

    CGPathRelease(pointPath);
}

3 个答案:

答案 0 :(得分:1)

- (void)drawPathWithPoints:(int)xAxis andYaxis:(int)yAxis
{    
    CGSize screenSize = drawingImgView.frame.size;

    UIGraphicsBeginImageContext(drawingImgView.frame.size);

    CGContextRef currentContext = UIGraphicsGetCurrentContext();
     [drawingImgView.image drawInRect:CGRectMake(0, 0, screenSize.width, screenSize.height)];

    CGContextSetLineCap(currentContext, kCGLineCapRound);
    CGContextSetLineWidth(currentContext, 9.0);
    CGContextSetRGBStrokeColor(currentContext, 0, 0, 1, 1);
    CGContextBeginPath(currentContext);



    CGContextMoveToPoint(currentContext,xAxis,yAxis);

     CGContextAddLineToPoint(currentContext, xAxis, yAxis);
            CGContextStrokePath(UIGraphicsGetCurrentContext());

  drawingImgView.image = UIGraphicsGetImageFromCurrentImageContext();

    CGPathRelease(pointPath);
}

答案 1 :(得分:0)

如果您想在UIView上绘制线条,请使用touchesBegan:touchesMoved:方法..我将其与一个Demo一起使用,代码如下...

#pragma mark - Touch Methods
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    myPath = [[UIBezierPath alloc] init];
    myPath.lineWidth = 10;

    UITouch *mytouch = [[touches allObjects] objectAtIndex:0];
    [myPath moveToPoint:[mytouch locationInView:self]];
    [pathArray addObject:myPath];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{    
    UITouch *mytouch = [[touches allObjects] objectAtIndex:0];
    [myPath addLineToPoint:[mytouch locationInView:self]];
    [self setNeedsDisplay];
}

答案 2 :(得分:0)

#import <QuartzCore/QuartzCore.h>
#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self drawlineFromPoint:CGPointMake(10, 10) toPoint:CGPointMake(300, 300)];
}

- (void)drawlineFromPoint:(CGPoint)firstPoint toPoint:(CGPoint)secondPoint
{
    //1. Create bezier path from first point to second.
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:firstPoint];
    [path addLineToPoint:secondPoint];


    //2. Create a shape layer for above created path.
    CAShapeLayer *myLayer = [[CAShapeLayer alloc] init];
    myLayer.strokeColor = [[UIColor greenColor] CGColor];
    myLayer.lineWidth = 11.0;
    myLayer.fillColor = nil;
    myLayer.lineJoin = kCALineJoinBevel;
    myLayer.path = path.CGPath;
    [self.imageView.layer addSublayer:myLayer];


    //3. Animate the path
    CABasicAnimation *drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    drawAnimation.duration            = 3.0;
    drawAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
    drawAnimation.toValue   = [NSNumber numberWithFloat:1.0f];
    drawAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [myLayer addAnimation:drawAnimation forKey:@"drawLineAnimation"];
}

@end

希望这有帮助!