如何旋转24小时制钟表的手?

我正在做一个时钟项目,我知道如何实现12小时制的时钟(小时,分钟,秒)旋转。 我使用的代码如下

CGFloat secAngle,minAngle,hourAngle; NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:[NSDate date]]; NSInteger seconds = [dateComponents second]; NSInteger minutes = [dateComponents minute]; NSInteger hours = [dateComponents hour]; if (timeFormat == 12)//12 hour clock { if (hours > 12) hours -=12; //PM secAngle = Degrees2Radians(seconds/60.0*360); minAngle = Degrees2Radians(minutes/60.0*360); hourAngle = Degrees2Radians(hours/12.0*360) + minAngle/12.0; //secHand.transform = CATransform3DMakeRotation (secAngle+M_PI, 0, 0, 1); minHand.transform = CATransform3DMakeRotation (minAngle+M_PI, 0, 0, 1); hourHand.transform = CATransform3DMakeRotation (hourAngle+M_PI, 0, 0, 1); } else //24 hour clock { secAngle = Degrees2Radians(seconds/60.0*360); minAngle = Degrees2Radians(minutes/60.0*360); hourAngle = (30 * hours + minutes / 2) /2; //secHand.transform = CATransform3DMakeRotation(secAngle * M_PI / 180,0,0,1); minHand.transform = CATransform3DMakeRotation(minAngle * M_PI ,0,0,1); hourHand.transform = CATransform3DMakeRotation(hourAngle * M_PI,0,0,1); } 

但是,当我尝试实施24小时制。 它不工作。 每当我运行这个项目时钟显示错误的时间。

谁能告诉我我做了什么错事。 提前谢谢了

下面是我如何做到这一点 – 我使用脸部中心和angular度来计算手部端点的x,y位置,从那里画图很简单。 这是一个完整的钟面类。 这是UIView的一个子类。 每秒设置一次时间属性,它的function就像一个魅力…

 // // ClockFace.h // #import <UIKit/UIKit.h> @interface ClockFace : UIView @property (strong,nonatomic) NSDate *time; @end // ClockFace.m #import "ClockFace.h" @interface ClockFace () @property(assign,nonatomic) CGPoint boundsCenter; @property(assign,nonatomic) NSInteger seconds; @property(assign,nonatomic) NSInteger minutes; @property(assign,nonatomic) NSInteger hours; @end @implementation ClockFace @synthesize time=_time; @synthesize boundsCenter=_boundsCenter; - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { _boundsCenter = CGPointMake(self.bounds.size.width/2.0, self.bounds.size.height/2.0); } return self; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code _boundsCenter = CGPointMake(self.bounds.size.width/2.0, self.bounds.size.height/2.0); } return self; } - (CGPoint)secondsHandPosition { float secondsAsRadians = (float)self.seconds / 60.0 * 2.0 * M_PI - M_PI_2; float handRadius = self.frame.size.width / 2.4; return CGPointMake(handRadius*cosf(secondsAsRadians)+self.boundsCenter.x, handRadius*sinf(secondsAsRadians)+self.boundsCenter.y); } - (CGPoint)minutesHandPosition { float minutesAsRadians = (float)self.minutes / 60.0 * 2.0 * M_PI - M_PI_2; float handRadius = self.frame.size.width / 2.2; return CGPointMake(handRadius*cosf(minutesAsRadians)+self.boundsCenter.x, handRadius*sinf(minutesAsRadians)+self.boundsCenter.y); } - (CGPoint)hoursHandPosition { float hoursAsRadians = (float)self.hours / 12.0 * 2.0 * M_PI - M_PI_2; float handRadius = self.frame.size.width / 3.8; return CGPointMake(handRadius*cosf(hoursAsRadians)+self.boundsCenter.x, handRadius*sinf(hoursAsRadians)+self.boundsCenter.y); } // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGFloat zClear[4] = {1.0,1.0,1.0,0.0}; CGContextSetFillColor(context, zClear); CGContextFillRect(context, rect); CGRect face = CGRectInset(rect, 1.0, 1.0); CGContextSetLineWidth(context, 1.0); CGContextAddEllipseInRect(context, face); CGContextStrokePath(context); CGRect center = CGRectMake(self.boundsCenter.x-2.0, self.boundsCenter.y-2.0, 4.0, 4.0); CGContextAddEllipseInRect(context, center); CGContextStrokePath(context); CGFloat red[4] = {1.0f, 0.0f, 0.0f, 1.0f}; CGPoint secondsHandPosition = [self secondsHandPosition]; CGContextSetStrokeColor(context, red); CGContextBeginPath(context); CGContextMoveToPoint(context, self.boundsCenter.x, self.boundsCenter.y); CGContextAddLineToPoint(context, secondsHandPosition.x, secondsHandPosition.y); CGContextStrokePath(context); CGFloat black[4] = {0.0f, 0.0f, 0.0f, 1.0f}; CGPoint minutesHandPosition = [self minutesHandPosition]; CGContextSetStrokeColor(context, black); CGContextBeginPath(context); CGContextMoveToPoint(context, self.boundsCenter.x, self.boundsCenter.y); CGContextAddLineToPoint(context, minutesHandPosition.x, minutesHandPosition.y); CGContextStrokePath(context); CGPoint hoursHandPosition = [self hoursHandPosition]; CGContextSetStrokeColor(context, black); CGContextBeginPath(context); CGContextMoveToPoint(context, self.boundsCenter.x, self.boundsCenter.y); CGContextAddLineToPoint(context, hoursHandPosition.x, hoursHandPosition.y); CGContextStrokePath(context); } - (void)setTime:(NSDate *)time { _time = time; static NSCalendar *gregorian; if (!gregorian) gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:time]; self.hours = [weekdayComponents hour]; if (self.hours > 12) self.hours -= 12; self.minutes = [weekdayComponents minute]; self.seconds = [weekdayComponents second]; [self setNeedsDisplay]; } @end 

要在视图控制器中使用它,请创build一个属性:

 #import "ClockFace.h" // ... @property(strong, non atomic) ClockFace *clockFace; 

在视图中加载(或如果你知道如何添加自定义视图在故事板):

 self.clockFace = [[ClockFace alloc] initWithFrame:CGRectMake(10, 10, 300, 300)]; 

每当你想要时钟运行,设置一个计时器:

 [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:NO]; 

当定时器启动时,告诉时钟是什么时间:

 - (void)timerFired:(NSTimer *)timer { self.clockFace.time = [NSDate date]; }