旋转两个UIImageViews 360度

时间:2008-11-23 06:44:53

标签: cocoa-touch

我一直试图在它们上面放置两个固定大小的UII图像(覆盖所有视图),但我一直在努力(我放弃!)以循环方式旋转它们。因此,如果我有一个UIView,另一个在它旁边,我希望能够旋转第一个(和另一个,没有间隙)跟随它,并以360度方式旋转,它只是不可能!

有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

我写的第一段iPhone代码就是以下内容,用于显示由树叶制成的时钟。

时钟是从三片叶子,小时,分钟和秒创建的,我们有一个叶子图像,用不同的缩放比例,不透明度等绘制,以给出时钟的外观。

下面的UIView在视图的中心绘制一个时钟,使用平移和缩放将叶子放在正确的位置。保存并恢复CTM以保存重复的翻译。

您可能希望查看它是否可以帮助您处理坐标系和旋转方式。

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