核心动画06-时钟(了解)
// ViewController.m // 06-时钟(了解) #import "ViewController.h" #define kClockW _clockView.bounds.size.width #define angle2radion(a) ((a) / 180.0 * M_PI) // 一秒钟秒针转6° #define perSecondA 6 // 一分钟分针转6° #define perMinuteA 6 // 一小时时针转30° #define perHourA 30 // 每分钟时针转多少度 #define perMinuteHourA 0.5 @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *clockView; @property (nonatomic, weak) CALayer *secondLayer; @property (nonatomic, weak) CALayer *minuteLayer; @property (nonatomic, weak) CALayer *hourLayer; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 添加时针 [self setUpHourLayer]; // 添加分针 [self setUpMinuteLayer]; // 添加秒针 [self setUpSecondLayer]; // 添加定时器 [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES]; [self timeChange]; } - (void)timeChange { // 获取当前的系统的时间 // 获取当前日历对象 NSCalendar *calendar = [NSCalendar currentCalendar]; // 获取日期的组件:年月日小时分秒 // components:需要获取的日期组件 // fromDate:获取哪个日期的组件 // 经验:以后枚举中有移位运算符,通常一般可以使用并运算(|) NSDateComponents *cmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]]; // 获取秒 NSInteger second = cmp.second; // 获取分 NSInteger minute = cmp.minute; // 获取小时 NSInteger hour = cmp.hour; // 计算秒针转多少度 CGFloat secondA = second * perSecondA; // 计算分针转多少度 CGFloat minuteA = minute * perMinuteA; // 计算时针转多少度 CGFloat hourA = hour * perHourA + minute * perMinuteHourA; // 旋转秒针 _secondLayer.transform = CATransform3DMakeRotation(angle2radion(secondA), 0, 0, 1); // 旋转分针 _minuteLayer.transform = CATransform3DMakeRotation(angle2radion(minuteA), 0, 0, 1); // 旋转小时 _hourLayer.transform = CATransform3DMakeRotation(angle2radion(hourA), 0, 0, 1); } #pragma mark - 添加秒针 - (void)setUpSecondLayer { CALayer *secondL = [CALayer layer]; secondL.backgroundColor = [UIColor redColor].CGColor; // 设置锚点 secondL.anchorPoint = CGPointMake(0.5, 1); secondL.position = CGPointMake(kClockW * 0.5, kClockW * 0.5); secondL.bounds = CGRectMake(0, 0, 1, kClockW * 0.5 - 20); [_clockView.layer addSublayer:secondL]; _secondLayer = secondL; } #pragma mark - 添加分针 - (void)setUpMinuteLayer { CALayer *layer = [CALayer layer]; layer.backgroundColor = [UIColor blackColor].CGColor; // 设置锚点 layer.anchorPoint = CGPointMake(0.5, 1); layer.position = CGPointMake(kClockW * 0.5, kClockW * 0.5); layer.bounds = CGRectMake(0, 0, 4, kClockW * 0.5 - 20); layer.cornerRadius = 4; [_clockView.layer addSublayer:layer]; _minuteLayer = layer; } #pragma mark - 添加时针 - (void)setUpHourLayer { CALayer *layer = [CALayer layer]; layer.backgroundColor = [UIColor blackColor].CGColor; // 设置锚点 layer.anchorPoint = CGPointMake(0.5, 1); layer.position = CGPointMake(kClockW * 0.5, kClockW * 0.5); layer.bounds = CGRectMake(0, 0, 4, kClockW * 0.5 - 40); layer.cornerRadius = 4; [_clockView.layer addSublayer:layer]; _hourLayer = layer; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
核心动画
// // ViewController.m // 07-核心动画-CABasicAnimation #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIView *redView; @property (weak, nonatomic) IBOutlet UIImageView *imageV; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 创建动画 CABasicAnimation *anim = [CABasicAnimation animation]; // 描述下修改哪个属性产生动画 // anim.keyPath = @"position"; // 只能是layer属性 anim.keyPath = @"transform.scale"; // 设置值 // anim.toValue = [NSValue valueWithCGPoint:CGPointMake(250, 500)]; anim.toValue = @0.5; // 设置动画执行次数 anim.repeatCount = MAXFLOAT; // 取消动画反弹 // 设置动画完成的时候不要移除动画 anim.removedOnCompletion = NO; // 设置动画执行完成要保持最新的效果 anim.fillMode = kCAFillModeForwards; [_imageV.layer addAnimation:anim forKey:nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
08-核心动画-CAKeyFrameAnimation
// ViewController.m // 08-核心动画-CAKeyFrameAnimation #import "ViewController.h" #define angle2Radion(angle) (angle / 180.0 * M_PI) @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // _imageView.layer.anchorPoint = CGPointZero; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
// // DrawView.m // 08-核心动画-CAKeyFrameAnimation #import "DrawView.h" @interface DrawView () @property (nonatomic, strong) UIBezierPath *path; @end @implementation DrawView - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // touch UITouch *touch = [touches anyObject]; // 获取手指的触摸点 CGPoint curP = [touch locationInView:self]; // 创建路径 UIBezierPath *path = [UIBezierPath bezierPath]; _path = path; // 设置起点 [path moveToPoint:curP]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { // touch UITouch *touch = [touches anyObject]; // 获取手指的触摸点 CGPoint curP = [touch locationInView:self]; [_path addLineToPoint:curP]; [self setNeedsDisplay]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { // 给imageView添加核心动画 // 添加核心动画 CAKeyframeAnimation *anim = [CAKeyframeAnimation animation]; anim.keyPath = @"position"; // anim.values = @[@(angle2Radion(-10)),@(angle2Radion(10)),@(angle2Radion(-10))]; anim.path = _path.CGPath; anim.duration = 1; anim.repeatCount = MAXFLOAT; [[[self.subviews firstObject] layer] addAnimation:anim forKey:nil]; } - (void)drawRect:(CGRect)rect { [_path stroke]; } @end
本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji