iosipaddrawrectcgcontextref

Can I draw shapes like circle,rectangle,line etc outside drawRect method


Can I draw shapes like circle, rectangle, line etc outside drawRect method using

CGContextRef contextRef = UIGraphicsGetCurrentContext();

or is it mandatory to use it inside drawRect only. Please help me, let me know how can I draw shapes outside drawRect method. Actually i want to go on plotting dots on touchesMoved event.

This is my code for drawing a dot.

CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(contextRef, 0, 255, 0, 1);
CGContextFillEllipseInRect(contextRef, CGRectMake(theMovedPoint.x, theMovedPoint.y, 8, 8));

Solution

  • Basically you need a context to draw something. You can assume context as a white paper. UIGraphicsGetCurrentContext will return null if you are not in a valid context.In drawRect you get the context of the view.

    Having said that, you can draw outside drawRect Method. You can begin an imageContext to draw things and add it to your view.

    Look at the below example taken from here,

        - (UIImage *)imageByDrawingCircleOnImage:(UIImage *)image
    {
        // begin a graphics context of sufficient size
        UIGraphicsBeginImageContext(image.size);
    
        // draw original image into the context
        [image drawAtPoint:CGPointZero];
    
        // get the context for CoreGraphics
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    
        // set stroking color and draw circle
        [[UIColor redColor] setStroke];
    
        // make circle rect 5 px from border
        CGRect circleRect = CGRectMake(0, 0,
                    image.size.width,
                    image.size.height);
        circleRect = CGRectInset(circleRect, 5, 5);
    
        // draw circle
        CGContextStrokeEllipseInRect(ctx, circleRect);
    
        // make image out of bitmap context
        UIImage *retImage = UIGraphicsGetImageFromCurrentImageContext();
    
        // free the context
        UIGraphicsEndImageContext();
    
        return retImage;
    }