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?

+1


source to share


1 answer


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];
}

      

+3


source







All Articles