2013-02-12 2 views
1

Я работаю над проектом часов, я знаю, как реализовать руки (Час, Минута, Секунды), вращение 12-часовых часов. Код, который я использовал, следующий:Как повернуть часы часов на 24 часа?

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-часовые часы. Это не работает. Каждый раз, когда я запускаю этот проект, часы показывают неправильные тайминги.

Может ли кто-нибудь сказать мне, что я сделал неправильно. Большое спасибо заранее

+0

Можете ли вы привести несколько примеров того, как код не так? например в данный момент времени в реальном времени, это показывает это неправильное время. –

+1

Как вы пришли к формуле «hourAngle» в 24-часовом случае? Почему это не похоже на формулу в 12-часовом случае? Разве вы не думаете, что 24-часовая формула должна быть похожа на 12-часовую формулу с дополнительным коэффициентом 2 в ней? –

+0

Не будет ли функция для расчета 24-часового угла быть такой же, как расчет угла часа на 12, только что переключился на 24 вместо часов/12 – CBredlow

ответ

4

Вот как я это делаю - я использую центр лица и угол для вычисления положения х, у конечных точек рук, рисунок прост оттуда. Вот полный класс лица часов. Это подкласс 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]; 
} 
+0

Будет хорошо, если вы предоставите проект исходного кода. Я не знаю, как это назвать. – surendher

+0

Я почему-то пропустил ваш ответ. Сожалею. Я редактировал, чтобы добавить код, демонстрирующий, как звонить. Надеюсь, это имеет смысл. – danh

Смежные вопросы