雷达扫描动画
Posted OIMM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了雷达扫描动画相关的知识,希望对你有一定的参考价值。
#import "ViewController.h" #import "RadarView.h" @interface ViewController () @property (nonatomic, strong) RadarView *radarView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; self.radarView = [[RadarView alloc]initWithFrame:CGRectMake(0, 0, 370, 370)]; self.radarView.center = self.view.center; [self.view addSubview:self.radarView]; [self.radarView radarScan]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
RadarView.h 文件
// // RadarView.h // ScanAnimation // #import <UIKit/UIKit.h> #import "RadarIndicationView.h" @interface RadarView : UIView @property (nonatomic, strong)RadarIndicationView *radarIndicationView; -(void) radarScan; @end
RadarView.m 文件
// // RadarView.m // ScanAnimation // #import "RadarView.h" @implementation RadarView -(instancetype)initWithFrame:(CGRect)frame{ if ([super initWithFrame:frame]) { [self addSubview:self.radarIndicationView]; } return self; } -(void) drawRect:(CGRect)rect{ [super drawRect:rect]; CGContextRef context = UIGraphicsGetCurrentContext(); [self drawCircle:context]; } - (RadarIndicationView *)radarIndicationView{ if (!_radarIndicationView) { _radarIndicationView = [[RadarIndicationView alloc]initWithFrame:CGRectMake(0, 0, 340, CGRectGetHeight(self.frame))]; _radarIndicationView.center = self.center; } return _radarIndicationView; } - (void)drawCircle:(CGContextRef )context { //将坐标轴移动到视图中心 CGContextTranslateCTM(context, CGRectGetWidth(self.frame)/2.0, CGRectGetHeight(self.frame)/2.0); CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor); CGContextSetLineWidth(context, 2); //画圆弧 for (int i = 0; i <4; i++) { CGContextMoveToPoint(context, 50+i*40, 0); CGContextAddArc(context, 0, 0, 50+i*40, 0, M_PI*2, 0); } CGContextStrokePath(context); //画十字坐标 CGContextMoveToPoint(context, -170, 0); CGContextAddLineToPoint(context, 170, 0); CGContextMoveToPoint(context, 0, -170); CGContextAddLineToPoint(context, 0, 170); CGContextStrokePath(context); } //开始扫描 -(void) radarScan{ [self.radarIndicationView start]; }
RadarIndicationView.h 文件
// // RadarIndicationView.h // ScanAnimation // #import <UIKit/UIKit.h> @interface RadarIndicationView : UIView -(void) start; -(void) stop; @end
RadarIndicationView.m 文件
// // RadarIndicationView.m // ScanAnimation // #import "RadarIndicationView.h" @implementation RadarIndicationView -(instancetype)initWithFrame:(CGRect)frame{ if ([super initWithFrame:frame]) { self.backgroundColor = [UIColor clearColor]; } return self; } -(void) drawRect:(CGRect)rect{ [super drawRect:rect]; CGContextRef context = UIGraphicsGetCurrentContext(); [self drawArc:context]; } //画大扇形 -(void) drawArc:(CGContextRef) context{ //将坐标轴移到视图中心 CGContextTranslateCTM(context, CGRectGetWidth(self.frame)/2.0, CGRectGetHeight(self.frame)/2.0); //设置扇形半径 CGFloat radius = CGRectGetWidth(self.frame)/2.0; CGContextSetLineWidth(context, 0.1); CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); CGFloat single = M_PI/180/2.0;//画图时每次旋转的度数 CGFloat colorAlpha = M_PI_2/90/2.0; CGFloat x = 0.0; for (int i = 0; i < 90*2; i++) { //画小扇形 CGContextMoveToPoint(context, 0, 0); CGContextAddArc(context, 0, 0, radius, 0, -single, 1); //设置填充颜色以及透明度 x = x + colorAlpha; CGFloat alpha = sin(1-x); UIColor *color = [UIColor colorWithRed:41/255 green:253/255 blue:47/255 alpha:alpha]; [color setFill]; CGContextFillPath(context); CGContextDrawPath(context, kCGPathFillStroke);//绘制路径 //逆时针旋转坐标 CGContextRotateCTM(context, -single); } } - (void) start{ [self setNeedsDisplay]; CABasicAnimation *rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = @(2*M_PI); rotationAnimation.duration = 360/60; rotationAnimation.repeatCount = NSIntegerMax; [self.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; } -(void)stop{ [self.layer removeAnimationForKey:@"rotationAnimation"]; } -(void)rectangularCoordinates{ //画x CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, 1); CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor); CGContextMoveToPoint(context, 0, 0); CGContextAddLineToPoint(context, 150, 0); CGContextStrokePath(context); CGContextMoveToPoint(context, 150, 0); CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); CGContextAddLineToPoint(context, 140, 5); CGContextMoveToPoint(context, 150, 0); CGContextAddLineToPoint(context, 140, -5); CGContextStrokePath(context); //画y CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor); CGContextMoveToPoint(context, 0, 0); CGContextAddLineToPoint(context, 0, 150); CGContextAddLineToPoint(context, 5, 140); CGContextMoveToPoint(context, -5, 150); CGContextAddLineToPoint(context, -5, 140); CGContextStrokePath(context); }
以上是关于雷达扫描动画的主要内容,如果未能解决你的问题,请参考以下文章