使用核心动画/ CALayers动画时钟

时间:2011-07-20 19:14:47

标签: objective-c ios core-animation nsdate calayer

我有一个4层的UIViewControler。

  1. 手表/时钟的面板
  2. 二手
  3. 分钟
  4. 时针
  5. 我已经让每只手在正确的时间开始移动(通过根据应用加载的时间在圆上定义角度)。

    如何使用CABasicAnimation存取方法正确定义运动的动作和持续时间(应无限制)?

    例如,我将我的secondHandMotion(实例化的CABasicAnimation对象)设置为与当前时间对应的时钟帧上的某个角度:

    CABasicAnimation *secondHandMotion = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    secondHandMotion.fromValue = [NSNumber numberWithFloat:sAlpha];
    secondHandMotion.toValue = [NSNumber numberWithFloat:(2*M_PI)];
    [secondHand addAnimation:secondHandMotion forKey:@"transform"];
    

    其中sAlpha是作为时间函数的角度。 我知道secondHandMotion.toValue声明是错误的。我怎么告诉它继续移动,并以正确的间隔,1秒钟滴答?

    谢谢!

2 个答案:

答案 0 :(得分:5)

当我在我的一个应用程序中实现此功能时,我从本教程开始

Analog Clock using Quartz Core 断开链接

See Source on Github instead.

它会重新计算每一秒,这可能会给出与系统时钟相关的更准确的结果。

我实现旋转的方式是这样的(这是动画部分,你仍然需要你以前做过的角度计算)。

CGAffineTransform transform = CGAffineTransformIdentity;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];

self.hourView.transform   = CGAffineTransformRotate(transform, hourAngle);
self.minView.transform    = CGAffineTransformRotate(transform, minutesAngle);
self.secondView.transform = CGAffineTransformRotate(transform, secondsAngle);

[UIView commitAnimations];

注意:我在iOS学习中很早就写了这个,所以它可能有点可怕。

答案 1 :(得分:1)

看看PSAnalogClockView。它以可重用的方式很好地解决了您的问题。