It would also be nice to draw multiple clocks if one is ‘full’ it starts another. This example draws and returns a maximum of three clocks but always returns a 90×30 image:
- (UIImage *)drawClocks:(NSNumber *)time { UIImage *image; int clock1=0, clock2=0, clock3=0; CGRect rect = CGRectMake(0,0,90,30); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); // We wish to draw clocks right to left according to how many minutes we have, max of 180m. int era = [time intValue]; if(era>59) { clock1 = 60; } else { clock1 = era; } if (era>119) { clock2 = 60; } else { clock2 = era>60?era%60:0; } if (era>179) { clock3 = 60; } else { clock3 = era>120?era%60:0; } if (clock1) { UIImage *image1 = [self drawTime:[NSNumber numberWithInt:clock1]]; CGContextDrawImage(context, CGRectMake(0, 0, 30, 30), [image1 CGImage]); } if (clock2) { UIImage *image2 = [self drawTime:[NSNumber numberWithInt:clock2]]; CGContextDrawImage(context, CGRectMake(30, 0, 30, 30), [image2 CGImage]); } if (clock3) { UIImage *image3 = [self drawTime:[NSNumber numberWithInt:clock3]]; CGContextDrawImage(context, CGRectMake(60, 0, 30, 30), [image3 CGImage]); } image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }
Also the <A HREF="http://www.thelostsouls.org More Help.uk/2010/08/drawing-little-clock-icons-dynamically”>last post mentioned that the eventual UI view would need to do the rotate. If this is added straight after the context is obtained:
// Save our current state (effectively inverted y for iOS) CGContextSaveGState(context); // Move image UP CGContextTranslateCTM(context, 0, 30); // Flip Y Axis CGContextScaleCTM(context, 1.0, -1.0); // Rotate 90 degrees CGContextRotateCTM(context, -M_PI/2); // Move it Back down so it's in our frame again. CGContextTranslateCTM(context, -30, 0); // It really helps if you're stuck to draw your image on a bit of paper and flip/rotate it visually. // E.g. I draw my 45 minute clock on a bit of paper with 0 marked on the east then tried rotations/flips // to get the view I wanted. then wrote them out above!
You don’t need to include my last comment… then add this before you get the image:
// Restore original context. CGContextRestoreGState(context);
No more rotation is needed. It’s left as an exercise to whomever as to why the translations above produce the correct orientation. I really did draw it on a little square of paper. 😛