我是这样做的——我使用面部中心和角度来计算手端点的 x、y 位置,从那里开始绘图很简单。这是一个完整的钟面类。它是 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];
}