Rotating two UIImageViews 360 degrees
I am trying to have two fixed sized UIImageviews with images on them (which cover all views), but I try very hard (I refuse!) To rotate each one in a circular way, So if I have one UIView and another next to it, I I would like it to rotate the first one (and the other at once, without spaces), following it, and rotate 360 ββdegrees, this is simply impossible!
Can anyone help me?
One of the first iPhone code snippets I wrote was the following to display a clock made from leaves.
The clock is created from three sheets, hours, minutes and seconds, and we have one sheet image that is drawn with different scaling, opacity, etc. to create the look of the clock.
The UIView below draws a clock in the center of the view using translation and scaling to put the leaves in the right place. The CTM is saved and restored to save repeated translations.
You might want to look and see if it helps you deal with coordinate systems and rotation.
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame])
{
// Initialization code
self.minutes = 49;
self.seconds = 0;
// clear to transparent
self.clearsContextBeforeDrawing = YES;
self.backgroundColor = [UIColor clearColor];
[self tick:nil];
}
return self;
}
- (void)tick:(NSTimer *)timer
{
// get time
NSDate * time = [NSDate date];
NSCalendar * gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents * comp = [gregorian components:NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit fromDate:time];
// update the time
self.seconds = [comp second];
self.minutes = [comp minute];
self.hours = [comp hour];
// redisplay
[self setNeedsDisplay];
}
- (float)toRadians:(float)deg
{
return deg * 3.14/180.0;
}
- (void)drawClock:(CGPoint)pos hours:(NSInteger)theHours minutes:(NSInteger)theMinutes seconds:(NSInteger)theSeconds
{
UIImage * leaf = [UIImage imageNamed:@"leaf.png"];
// context
CGContextRef myContext = UIGraphicsGetCurrentContext();
// save original state
CGContextSaveGState(myContext);
// set alpha and move it to centre of clock
CGContextSetAlpha(myContext, 0.8);
CGContextTranslateCTM (myContext, pos.x, pos.y);
// save centred state
CGContextSaveGState(myContext);
// rotate and translate the hour 'hand'
CGContextRotateCTM (myContext, [self toRadians:(theHours-3.0+theMinutes/60.0)*360/12.0 - 10] );
CGContextTranslateCTM (myContext, -5, -[leaf size].height/12);
// draw the hour hand and restore to translated
CGContextDrawImage(myContext, CGRectMake(0, 0, [leaf size].width/6, [leaf size].height/6), [leaf CGImage]);
// restore centred state and resave
CGContextRestoreGState(myContext);
CGContextSaveGState(myContext);
// rotate and transform the minute 'hand'
CGContextRotateCTM (myContext, [self toRadians:((theMinutes-15)*360.0 /60.0) - 10]);
CGContextTranslateCTM (myContext, -5, -[leaf size].height/10);
// draw the minute hand and restore original context
CGContextDrawImage(myContext, CGRectMake(0, 0, [leaf size].width/5, [leaf size].height/5), [leaf CGImage]);
// restore centred state
CGContextRestoreGState(myContext);
// rotate and transform the second 'hand'
CGContextSetAlpha(myContext, 0.5);
CGContextRotateCTM (myContext, [self toRadians:((theSeconds-15)*360 /60.0) - 10]);
CGContextTranslateCTM (myContext, -5, -[leaf size].height/10);
// draw the second hand and restore original context
CGContextDrawImage(myContext, CGRectMake(0, 0, [leaf size].width/5, [leaf size].height/5), [leaf CGImage]);
CGContextRestoreGState(myContext);
}
- (void)drawRect:(CGRect)rect
{
// draw clock in clock view
[self drawClock:CGPointMake(rect.size.width/2,rect.size.height/2) hours:self.hours minutes:self.minutes seconds:self.seconds];
// test code for centering hands
// [self drawClock:CGPointMake(rect.size.width/2,rect.size.height/2) hours:12 minutes:00 seconds:00];
}
source to share