Вы задали тот же вопрос , и я сказал, что Layers намного лучше ... ну, на этот раз я написал программу дырок за рекордное время, чем менее трех недель;).
Если вы хотите использовать изображения, то получите ваши изображения и установите их внутри initWithFrame:
Интерфейс: ClockView.h
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface ClockView : UIView {
CALayer *containerLayer;
CALayer *hourHand;
CALayer *minHand;
CALayer *secHand;
NSTimer *timer;
}
- (void) start;
- (void) stop;
@end
Реализация: ClockView.m
#import "ClockView.h"
@implementation ClockView
float Degrees2Radians(float degrees) { return degrees * M_PI / 180; }
- (void) start{
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self
selector:@selector(updateClock)
userInfo:nil repeats:YES];
}
- (void) stop{
[timer invalidate];
timer = nil;
}
- (void) updateClock{
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit)
fromDate:[NSDate date]];
NSInteger seconds = [dateComponents second];
NSInteger minutes = [dateComponents minute];
NSInteger hours = [dateComponents hour];
//correction of inverted clock
seconds += 30; seconds %=60;
minutes += 30; minutes %=60;
hours += 6; hours %=12;
hourHand.transform = CATransform3DMakeRotation (Degrees2Radians(hours*360/12), 0, 0, 1);
minHand.transform = CATransform3DMakeRotation (Degrees2Radians(minutes*360/60), 0, 0, 1);
secHand.transform = CATransform3DMakeRotation (Degrees2Radians(seconds*360/60), 0, 0, 1);
}
- (void) layoutSubviews{
[super layoutSubviews];
containerLayer.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
float length = MIN(self.frame.size.width, self.frame.size.height)/2;
CGPoint c = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
hourHand.position = minHand.position = secHand.position = c;
hourHand.bounds = CGRectMake(0,0,10,length*0.5);
minHand.bounds = CGRectMake(0,0,8,length*0.8);
secHand.bounds = CGRectMake(0,0,4,length);
hourHand.anchorPoint = CGPointMake(0.5,0.0);
minHand.anchorPoint = CGPointMake(0.5,0.0);
secHand.anchorPoint = CGPointMake(0.5,0.0);
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
containerLayer = [[CALayer layer] retain];
hourHand = [[CALayer layer] retain];
minHand = [[CALayer layer] retain];
secHand = [[CALayer layer] retain];
//paint your hands: simple colors
hourHand.backgroundColor = [UIColor blackColor].CGColor;
hourHand.cornerRadius = 3;
minHand.backgroundColor = [UIColor grayColor].CGColor;
secHand.backgroundColor = [UIColor whiteColor].CGColor;
secHand.borderWidth = 1.0;
secHand.borderColor = [UIColor grayColor].CGColor;
//put images
//hourHand.contents = (id)[UIImage imageNamed:@"hour.png"].CGImage;
//minHand.contents = (id)[UIImage imageNamed:@"min.png"].CGImage;
//secHand.contents = (id)[UIImage imageNamed:@"sec.png"].CGImage;
[containerLayer addSublayer:hourHand];
[containerLayer addSublayer:minHand];
[containerLayer addSublayer:secHand];
[self.layer addSublayer:containerLayer];
self.layer.borderColor = [UIColor greenColor].CGColor;
self.layer.borderWidth = 1.0;
}
return self;
}
- (void)dealloc {
[self stop];
[hourHand release];
[minHand release];
[secHand release];
[containerLayer release];
[super dealloc];
}
@end
Использование:
#import "ClockView.h"
- (void)viewDidLoad {
[super viewDidLoad];
ClockView *clockView = [[ClockView alloc] initWithFrame:CGRectMake(0,0,100,100)];
[self.view addSubview:clockView];
[clockView start];
[clockView release];
}