Вот как я это делаю - я использую центр лица и угол для вычисления положения х, у конечных точек рук, рисунок прост оттуда. Вот полный класс лица часов. Это подкласс UIView. Установить это время имущество каждый второй, и он работает как шарм ...
//
// 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
Чтобы использовать эту функцию в контроллере представления, создать свойство:
#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];
}
Можете ли вы привести несколько примеров того, как код не так? например в данный момент времени в реальном времени, это показывает это неправильное время. –
Как вы пришли к формуле «hourAngle» в 24-часовом случае? Почему это не похоже на формулу в 12-часовом случае? Разве вы не думаете, что 24-часовая формула должна быть похожа на 12-часовую формулу с дополнительным коэффициентом 2 в ней? –
Не будет ли функция для расчета 24-часового угла быть такой же, как расчет угла часа на 12, только что переключился на 24 вместо часов/12 – CBredlow