2015-04-22 14:29:52 COOL_BEAR_XX 阅读数 6816
  • 无人驾驶--从零入门实战视频教程

    无人驾驶实战视频培训课程:涉及无人驾驶入门教程、光学雷达在无人驾驶技术中应用,GPS及惯性传感器在无人驾驶应用、无人驾驶感知系统、强化学习在无人驾驶应用、卷积神经网络在无人驾驶技术应用等内容。 AI的力量在于落地,其中为瞩目的莫过于无人驾驶技术。CSDN学院联合王而川打造《无人驾驶实战课》,目的就是为了降低无人驾驶学习门槛,让更多人能接受到系统前沿的理论知识。课程分为Python+机器学习系统课+无人驾驶入门实战课,三个阶段,层层递进,从零入门!本课程为实战课,其他两方面学习请点击老师头像查看。

    3438 人正在学习 去看看 王而川

iOS中雷达波扩散动画的实现,该动画是一个基于layer层的动画

之前做的一个效果图如下图所示



现在对之前的做一定的修改,在另一个地方使用,

看代码,我解释一下有的地方,meHeardView是自定义的TableView的heardView,上面添加了头像Button,人物名称和等级Label。这个动画Layer是把层级关系移动到头像Button的下方,这样不会挡住按钮的显示。config.diyGreenColor,是我用单例写的自定义的颜色,你可以自己设置其他值。


/*--------------- 扩散动画 ---------------*/

    CALayer * spreadLayer;

    spreadLayer = [CALayer layer];

    CGFloat diameter = 130//扩散的大小

    spreadLayer.bounds = CGRectMake(0,0, diameter, diameter);

    spreadLayer.cornerRadius = diameter/2; //设置圆角变为圆形

    spreadLayer.position = personImageButton.center;

    spreadLayer.backgroundColor = [config.diyGreenColor CGColor];

    [meHeardView.layer insertSublayer:spreadLayer below:personImageButton.layer];//把扩散层放到头像按钮下面

    CAMediaTimingFunction * defaultCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];

    CAAnimationGroup * animationGroup = [CAAnimationGroup animation];

    animationGroup.duration = 3;

    animationGroup.repeatCount = INFINITY;//重复无限次

    animationGroup.removedOnCompletion = NO;

    animationGroup.timingFunction = defaultCurve;

    //尺寸比例动画

    CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"];

    scaleAnimation.fromValue = @0.7;//开始的大小

    scaleAnimation.toValue = @1.0;//最后的大小

    scaleAnimation.duration = 3;//动画持续时间

    //透明度动画

    CAKeyframeAnimation *opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];

    opacityAnimation.duration = 3;

    opacityAnimation.values = @[@0.4, @0.45,@0];//透明度值的设置

    opacityAnimation.keyTimes = @[@0, @0.2,@1];//关键帧

    opacityAnimation.removedOnCompletion = NO;

    animationGroup.animations = @[scaleAnimation, opacityAnimation];//添加到动画组

    [spreadLayer addAnimation:animationGroup forKey:@"pulse"];

    /*---------------------------------------*/


动画效果截图,这种动画效果就简单实现了,想要多圈雷达波的,自己循环写几个Layer就可以了。

                 




2017-09-12 15:47:11 sunnyaigd830 阅读数 294
  • 无人驾驶--从零入门实战视频教程

    无人驾驶实战视频培训课程:涉及无人驾驶入门教程、光学雷达在无人驾驶技术中应用,GPS及惯性传感器在无人驾驶应用、无人驾驶感知系统、强化学习在无人驾驶应用、卷积神经网络在无人驾驶技术应用等内容。 AI的力量在于落地,其中为瞩目的莫过于无人驾驶技术。CSDN学院联合王而川打造《无人驾驶实战课》,目的就是为了降低无人驾驶学习门槛,让更多人能接受到系统前沿的理论知识。课程分为Python+机器学习系统课+无人驾驶入门实战课,三个阶段,层层递进,从零入门!本课程为实战课,其他两方面学习请点击老师头像查看。

    3438 人正在学习 去看看 王而川

iOS精选源码

构建自己的条形图的方法

适用于iOS的雷达图表效果

ios Bluetooth ble 蓝牙开发 蓝牙库 蓝牙调式工具

可横竖向滑动的包含24小时时间显示的日历

swift3.0图片浏览器

iOS 精美过度动画源码

iOS选择卡改变视图内容

高度可定制的弹出式对话控制器。

SCMusic(网络音乐播放器)

页面间跳转的动画效果--简单酷炫易用




iOS优质博客

让你快速提高并掌握如何进行iOS开发技能

首先你要花点时间针对objective-c语言的学习;毕竟这个是iOS开发的基础(你也可以尝试用Swift,但此项目只是针对OC),编程套路其实都是差不多,多写多想多实践;关于环境的搭建就不在本文进行介绍,这部分内容可以自行百度或谷歌,都有相应的说明;对于一个刚入门总是希望有个完整的项目可以直接运行,并且从中学习功能模... 阅读原文

iOS开发小知识笔记

1 @property@property 是 readwrite,assign,atomic在使用 @property 时, 编译器默认会进行自动 synthesize,生成 getter 和 setter,同时把 ivar 和属性绑定起来使用 @dynamic,显式表示不希望编译器生成 getter 和 setter... 阅读原文

利用预加载让分页加载不再繁琐之单个分页讲解

大概是项目里太多的分页加载数据,所以一个简单、快捷、高效分页加载会使你那么的愉悦.大概就是这么丝滑github链接:JSLoadMoreService用法讲解属性预览NSObject+LoadMoreService.h/**123456789101112131415161718192021222324252627282... 阅读原文

iOS 如何优化项目

前言在项目业务趋于稳定的时候,开发完迭代需求后,我们可能会无所适从,进入一段空白期,但是对于攻城狮来说闲暇不是件好事,所以我们可能总想学点什么,却又没有头绪。这个时候我们就可以考虑完善和优化我们的项目了。从中可以运用到一些底层RunLoop或者Runtime的知识,熟能生巧总是没错的????1. 结构与架构1.1 结构... 阅读原文

iOS 保持界面流畅的技巧

演示项目在开始技术讨论前,你可以先下载我写的 Demo 跑到真机上体验一下:https:/ /github.com/ibireme/YYKit。 Demo 里包含一个微博的 Feed 列表、发布视图,还包含一个 Twitter 的 Feed 列表。为了公平起见,所有界面和交互我都从官方应用原封不动的抄了过来,数据也都是从... 阅读原文



欢迎扫码关注微信公众号
欢迎扫码关注微信公众号
2017-03-04 12:42:22 CBlog_life 阅读数 1532
  • 无人驾驶--从零入门实战视频教程

    无人驾驶实战视频培训课程:涉及无人驾驶入门教程、光学雷达在无人驾驶技术中应用,GPS及惯性传感器在无人驾驶应用、无人驾驶感知系统、强化学习在无人驾驶应用、卷积神经网络在无人驾驶技术应用等内容。 AI的力量在于落地,其中为瞩目的莫过于无人驾驶技术。CSDN学院联合王而川打造《无人驾驶实战课》,目的就是为了降低无人驾驶学习门槛,让更多人能接受到系统前沿的理论知识。课程分为Python+机器学习系统课+无人驾驶入门实战课,三个阶段,层层递进,从零入门!本课程为实战课,其他两方面学习请点击老师头像查看。

    3438 人正在学习 去看看 王而川

前段时间 没事儿,自己自定义了 一个雷达扫描/扩散效果的View。

扫描View 效果如下:



扩散View 效果如下:



自定义的代码如下:

1. RadarView.h

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSInteger, RadarViewType) {
    RadarViewTypeScan,
    RadarViewTypeDiffuse
};

@interface RadarView : UIView

/** 雷达 空心圆圈的颜色 */
@property (nonatomic, strong) UIColor * radarLineColor;
/** 扇形开始颜色 必须由RGBA值初始化
 *  [UIColor colorWithRed: green: blue: alpha:]
 */
@property (nonatomic, strong) UIColor * startColor;
/** 扇形结束颜色 必须由RGBA值初始化
 *  [UIColor colorWithRed: green: blue: alpha:]
 */
@property (nonatomic, strong) UIColor * endColor;

/**
 *
 *  @param radius       半径
 *  @param angle        角度
 *  @param radarLineNum 雷达线数量
 *  @param hollowRadius 空心圆半径
 *
 *  @return 扫描 雷达 View
 */
+ (RadarView *)scanRadarViewWithRadius:(CGFloat)radius
                                 angle:(int)angle
                          radarLineNum:(int)radarLineNum
                          hollowRadius:(CGFloat)hollowRadius;


/**
 *
 *  @param startRadius 扩散圆 起始的半径
 *  @param endRadius   扩散圆 消失的半径
 *  @param circleColor 扩散圆 的颜色
 *
 *  @return 扩散 雷达 View
 */
+ (RadarView *)diffuseRadarViewWithStartRadius:(CGFloat)startRadius
                                     endRadius:(CGFloat)endRadius
                                   circleColor:(UIColor *)circleColor;

/**
 *  展示在targerView上
 *
 *  @param targerView <#targerView description#>
 */
- (void)showTargetView:(UIView *)targerView;

- (void)dismiss;

/** 开始扫描动画 */
- (void)startAnimatian;

/** 停止扫描动画 */
- (void)stopAnimation;

@end

2. RadarView.m

#import "RadarView.h"

#define CenterX self.bounds.size.width*0.5
#define CenterY self.bounds.size.height*0.5

#define DefaultRadarLineColor [UIColor colorWithWhite:1 alpha:0.7]
#define DefaultStartColor [UIColor colorWithRed:1 green:1 blue:1 alpha:0.5]
#define DefaultEndColor [UIColor colorWithRed:1 green:1 blue:1 alpha:0]

#define DefaultCircleColor [UIColor colorWithWhite:1 alpha:0.5]

@interface RadarView ()

#pragma mark - 扫描类型的RadarView 属性
/** 扇形半径 */
@property (nonatomic, assign) CGFloat sectorRadius;
/** 扇形 角度 */
@property (nonatomic, assign) int angle;
/** 雷达 空心圆圈的数量 */
@property (nonatomic, assign) int radarLineNum;
/** 中心 空心圆的半径 (一般 这里放置一个圆形的头像) */
@property (nonatomic, assign) int hollowRadius;

#pragma mark - 扩散类型的RadarView 属性
/** 扩散动画 起始 的半径 */
@property (nonatomic, assign) CGFloat startRadius;
/** 扩散动画 结束 的半径 */
@property (nonatomic, assign) CGFloat endRadius;
/** 圆圈的颜色 */
@property (nonatomic, strong) UIColor * circleColor;

@property (nonatomic, strong) NSTimer * timer;

@property (nonatomic, assign) RadarViewType radarViewType;

@end

@implementation RadarView

+ (RadarView *)scanRadarViewWithRadius:(CGFloat)radius angle:(int)angle radarLineNum:(int)radarLineNum hollowRadius:(CGFloat)hollowRadius {
    return [[self alloc] initWithRadius:radius angle:angle radarLineNum:radarLineNum hollowRadius:hollowRadius];
}

- (instancetype)initWithRadius:(CGFloat)radius
                         angle:(int)angle
                  radarLineNum:(int)radarLineNum
                  hollowRadius:(CGFloat)hollowRadius {
    if (self = [super init]) {
        self.radarViewType = RadarViewTypeScan;
        self.sectorRadius = radius;
        self.frame = CGRectMake(0, 0, radius*2, radius*2);
        self.angle = angle;
        self.radarLineNum = radarLineNum-1;
        self.hollowRadius = hollowRadius;
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

+ (RadarView *)diffuseRadarViewWithStartRadius:(CGFloat)startRadius endRadius:(CGFloat)endRadius circleColor:(UIColor *)circleColor {
    return [[self alloc] initWithStartRadius:startRadius endRadius:endRadius circleColor:circleColor];
}

- (instancetype)initWithStartRadius:(CGFloat)startRadius endRadius:(CGFloat)endRadius circleColor:(UIColor *)circleColor {
    if (self = [super init]) {
        self.radarViewType = RadarViewTypeDiffuse;
        self.frame = CGRectMake(0, 0, endRadius*2, endRadius*2);
        self.startRadius = startRadius;
        self.endRadius = endRadius;
        self.circleColor = circleColor;
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
    if (_radarViewType == RadarViewTypeScan) {
        if (!_startColor) {
            _startColor = DefaultStartColor;
        }
        if (!_endColor) {
            _endColor = DefaultEndColor;
        }
        if (!_radarLineColor) {
            _radarLineColor = DefaultRadarLineColor;
        }
        
        // 画雷达线
        [self drawRadarLine];
        
        CGContextRef context = UIGraphicsGetCurrentContext();
        // 把要画的扇形 分开画,一次画1°,每次的颜色渐变
        for (int i = 0; i < _angle; i++) {
            UIColor * color = [self colorWithCurrentAngleProportion:i*1.0/_angle];
            [self drawSectorWithContext:context color:color startAngle:-90-i];
        }
    }
}

/** 画扇形 */
- (void)drawSectorWithContext:(CGContextRef)context
                        color:(UIColor *)color
                   startAngle:(CGFloat)startAngle {
    //画扇形,也就画圆,只不过是设置角度的大小,形成一个扇形
    CGContextSetFillColorWithColor(context, color.CGColor);//填充颜色
    CGContextSetLineWidth(context, 0);//线的宽度
    //以self.radius为半径围绕圆心画指定角度扇形
    CGContextMoveToPoint(context, CenterX, CenterY);
    CGContextAddArc(context, CenterX, CenterY, _sectorRadius, startAngle * M_PI / 180, (startAngle-1) * M_PI / 180, 1);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke); //绘制路径
}


/** 画雷达线 */
- (void)drawRadarLine {
    CGFloat minRadius = (_sectorRadius-_hollowRadius)*(pow(0.618, _radarLineNum-1));
    /** 画 围着空心半径的第一个空心圆,此圆不在计数内 */
    [self drawLineWithRadius:_hollowRadius+minRadius*0.382];
    
    for (int i = 0; i < _radarLineNum; i++) {
        [self drawLineWithRadius:_hollowRadius + minRadius/pow(0.618, i)];
    }
}

/** 画空心圆 */
- (void)drawLineWithRadius:(CGFloat)radius {
    CAShapeLayer *solidLine =  [CAShapeLayer layer];
    CGMutablePathRef solidPath =  CGPathCreateMutable();
    solidLine.lineWidth = 1.0f ;
    solidLine.strokeColor = _radarLineColor.CGColor;
    solidLine.fillColor = [UIColor clearColor].CGColor;
    CGPathAddEllipseInRect(solidPath, nil, CGRectMake(self.bounds.size.width*0.5-radius, self.bounds.size.height*0.5-radius, radius*2, radius*2));
    solidLine.path = solidPath;
    CGPathRelease(solidPath);
    [self.layer addSublayer:solidLine];
}

#pragma mark - 展示
- (void)showTargetView:(UIView *)targerView {
    self.center = targerView.center;
    [targerView addSubview:self];
}

#pragma mark - 
- (void)dismiss {
    [self removeFromSuperview];
}

#pragma mark - 开始动画
- (void)startAnimatian {
    if (_radarViewType == RadarViewTypeScan) {
        CABasicAnimation* rotationAnimation;
        rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        rotationAnimation.toValue = [NSNumber numberWithFloat: 1 * M_PI * 2.0 ];
        rotationAnimation.duration = 2;
        rotationAnimation.cumulative = YES;
        rotationAnimation.repeatCount = INT_MAX;
        [self.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
    } else {
        [self diffuseAnimation];
        _timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(diffuseAnimation) userInfo:nil repeats:YES];
    }
}

#pragma mark - 结束动画
- (void)stopAnimation {
    if (_radarViewType == RadarViewTypeScan) {
        [self.layer removeAnimationForKey:@"rotationAnimation"];
    } else {
        [_timer invalidate];
        _timer = nil;
    }
}

- (UIColor *)colorWithCurrentAngleProportion:(CGFloat)angleProportion {
    NSArray * startRGBA = [self RGBA_WithColor:_startColor];
    NSArray * endRGBA = [self RGBA_WithColor:_endColor];
    CGFloat currentR = [startRGBA[0] floatValue] - ([startRGBA[0] floatValue]-[endRGBA[0] floatValue]) * angleProportion;
    CGFloat currentG = [startRGBA[1] floatValue] - ([startRGBA[1] floatValue]-[endRGBA[1] floatValue]) * angleProportion;
    CGFloat currentB = [startRGBA[2] floatValue] - ([startRGBA[2] floatValue]-[endRGBA[2] floatValue]) * angleProportion;
    CGFloat currentA = [startRGBA[3] floatValue] - ([startRGBA[3] floatValue]-[endRGBA[3] floatValue]) * angleProportion;
    return [UIColor colorWithRed:currentR green:currentG blue:currentB alpha:currentA];
}

/**
 *  将UIColor对象解析成RGBA 值 的数组
 *
 *  @param color UIColor对象,有RGBA值 初始化的
 *[UIColor colorWithRed:rValue green:gValue blue:bValue alpha:aValue]
 *
 *  @return 包含RGBA值得数组[rValue, gValue, bValue, aValue]
 */
- (NSArray *)RGBA_WithColor:(UIColor *)color {
    NSString * colorStr = [NSString stringWithFormat:@"%@", color];
    //将RGB值描述分隔成字符串
    NSArray * colorValueArray = [colorStr componentsSeparatedByString:@" "];
    NSString * R = colorValueArray[1];
    NSString * G = colorValueArray[2];
    NSString * B = colorValueArray[3];
    NSString * A = colorValueArray[4];
    return @[R, G, B, A];
}

/** 画圆 */
- (UIImage *)drawCircle {
    UIGraphicsBeginImageContext(CGSizeMake(_endRadius*2, _endRadius*2));
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextMoveToPoint(context, CenterX, CenterY);
    CGContextSetFillColorWithColor(context, _circleColor.CGColor);
    CGContextAddArc(context, CenterX, CenterY, _endRadius, 0, -2*M_PI, 1);
    CGContextFillPath(context);
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

- (void)diffuseAnimation {
    UIImageView * imgView = [[UIImageView alloc] init];
    imgView.image = [self drawCircle];
    imgView.frame = CGRectMake(0, 0, _startRadius, _startRadius);
    imgView.center = CGPointMake(CenterX, CenterY);
    [self addSubview:imgView];
    
    [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        imgView.frame = CGRectMake(0, 0, _endRadius*2, _endRadius*2);
        imgView.center = CGPointMake(CenterX, CenterY);
        imgView.alpha = 0;
    } completion:^(BOOL finished) {
        [imgView removeFromSuperview];
    }];
}

@end


3. ViewController.m 中使用的代码:

#import "ViewController.h"
#import "RadarView.h"

@interface ViewController ()

@property (nonatomic, strong) RadarView * scanRadarView;
@property (nonatomic, strong) RadarView * diffuseRadarView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    /** 扫描 类型 RadarView */
//    _scanRadarView = [RadarView scanRadarViewWithRadius:self.view.bounds.size.width*0.5 angle:400 radarLineNum:5 hollowRadius:0];
    
    /** 扩散 类型 RadarView */
    _diffuseRadarView = [RadarView diffuseRadarViewWithStartRadius:7 endRadius:self.view.bounds.size.width*0.5 circleColor:[UIColor whiteColor]];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    
//    [_scanRadarView showTargetView:self.view];
//    [_scanRadarView startAnimatian];
    
    [_diffuseRadarView showTargetView:self.view];
    [_diffuseRadarView startAnimatian];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

现在定义的是能代码加载使用,等有空了,再封装一些方法能在Storyboard中直接使用。

2016-05-16 11:29:17 qq_30513483 阅读数 1253
  • 无人驾驶--从零入门实战视频教程

    无人驾驶实战视频培训课程:涉及无人驾驶入门教程、光学雷达在无人驾驶技术中应用,GPS及惯性传感器在无人驾驶应用、无人驾驶感知系统、强化学习在无人驾驶应用、卷积神经网络在无人驾驶技术应用等内容。 AI的力量在于落地,其中为瞩目的莫过于无人驾驶技术。CSDN学院联合王而川打造《无人驾驶实战课》,目的就是为了降低无人驾驶学习门槛,让更多人能接受到系统前沿的理论知识。课程分为Python+机器学习系统课+无人驾驶入门实战课,三个阶段,层层递进,从零入门!本课程为实战课,其他两方面学习请点击老师头像查看。

    3438 人正在学习 去看看 王而川

今天闲余时间写了一个类似支付宝咻咻或者说雷达效果。望大神勿笑、写的粗糙。


更新了下文章,贴出Demo地址
github


先上效果图吧:


雷达效果图
说下主要思路吧:

主要用到了CAShapeLayer和UIBezierPath的经典结合画出自己想要的图再结合CAAnimation将动画添加到layer上实现效果。


timingFunction:动画的运动轨迹,用于变化起点和终点之间的插值计算,即它决定了动画运行的节奏,比如是均 匀变化(相同时间变化量相同)还是先快后慢,先慢后快还是先慢再快再慢。
动画的开始与结束的快慢,有五个预置分别为:
kCAMediaTimingFunctionLinear
线性,即匀速
kCAMediaTimingFunctionEaseIn 先慢后快
kCAMediaTimingFunctionEaseOut 先快后慢
kCAMediaTimingFunctionEaseInEaseOut 先慢后快再慢
kCAMediaTimingFunctionDefault 中间快

代码部分 ( 基本全部代码)
自定义一个view-- RadarAnimationView.h:

这里提供了一些属性、可以在外部进行设置。

 //定义Block的目的是为了点击雷达中间按钮时调用,此处定义,方便以后使用。
  typedef void(^RaderBtnBlock)(); 
  typedef void(^RaderBtnSelectBlock)();

  #import <UIKit/UIKit.h>

 //雷达效果
 @interface RadarAnimationView : UIView

 /**
 *  按钮图片  
 */
 @property (nonatomic ,strong) UIImage *image;
 /**
  *  按钮选中图片
 */
 @property (nonatomic ,strong) UIImage *selectImage;
 /**
 *  波纹颜色
 */
  @property (nonatomic,strong) UIColor *raderColor;

 /**
  *  按钮block  未选择状态
 */
 @property (nonatomic,copy) RaderBtnBlock block;
 /**
 *  按钮block  选择状态
 */
    @property (nonatomic,copy) RaderBtnSelectBlock selectBlock;

 @end
RadarAnimationView.m实现部分
static const float timeinterval = 0.5;

#import <QuartzCore/QuartzCore.h>
#import "RadarAnimationView.h"

@interface RadarAnimationView ()
{
    //定时器
    NSTimer *_timer;
}
//按钮图片
@property (nonatomic,strong)UIButton *iamgeBtn;

@end

@implementation RadarAnimationView

- (void)drawRect:(CGRect)rect {

    self.alpha = 0.5;
    //创建定时器
    _timer = [NSTimer scheduledTimerWithTimeInterval:timeinterval target:self selector:@selector(setUp) userInfo:nil repeats:YES];
}

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        _iamgeBtn = [[UIButton alloc]    initWithFrame:self.bounds];
        [_iamgeBtn addTarget:self action:@selector(imageBtnClick:)     forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:_iamgeBtn];

        //设置默认波纹颜色
        self.raderColor = [UIColor blueColor];
    }
    return self;
}

//按钮点击事件
-(void)imageBtnClick:(UIButton *)btn
{
    if (btn.selected) {

        NSLog(@"1");
        //调用block
        self.block(@"1");

    }else
    {
        NSLog(@"2");
        //调用block
        self.selectBlock(@"2");
    }

    btn.selected = !btn.selected;
}

//重写setter方法
-(void)setImage:(UIImage *)image
{
    _image = image;
    [self.iamgeBtn setImage:image forState:0];
}

-(void)setSelectImage:(UIImage *)selectImage
{
    _selectImage = selectImage;
    [self.iamgeBtn setImage:selectImage forState:1];
}

-(void)setRaderColor:(UIColor *)raderColor
{
    _raderColor = raderColor;
}


//画雷达圆圈图
-(void)setUp
{
    CGPoint center = CGPointMake(self.bounds.size.height / 2, self.bounds.size.width / 2);

    //使用贝塞尔画圆
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:50 startAngle:0 endAngle:2 * M_PI clockwise:YES];

    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.frame = self.bounds;
    //填充颜色
    shapeLayer.fillColor = self.raderColor.CGColor;
    //设置透明度、此处最好和动画里的一致、否则效果会不好
    shapeLayer.opacity = 0.2;
    shapeLayer.path = path.CGPath;


    [self.layer insertSublayer:shapeLayer below:self.iamgeBtn.layer];

    [self addAnimation:shapeLayer];
}

-(void)addAnimation:(CAShapeLayer *)shapeLayer
{
    //雷达圈圈大小的动画
    CABasicAnimation *basicAnimation = [CABasicAnimation animation];
    basicAnimation.keyPath = @"path";
    CGPoint center = CGPointMake    (self.bounds.size.height / 2, self.bounds.size.width / 2);
    UIBezierPath *path1 = [UIBezierPath bezierPathWithArcCenter:center radius:1 startAngle:0 endAngle:2 * M_PI clockwise:YES];
    UIBezierPath *path2 = [UIBezierPath bezierPathWithArcCenter:center radius:[UIScreen mainScreen].bounds.size.height startAngle:0 endAngle:2 * M_PI clockwise:YES];
    basicAnimation.fromValue = (__bridge id _Nullable)(path1.CGPath);
    basicAnimation.toValue = (__bridge id _Nullable)(path2.CGPath);
    //保持最新状态
    basicAnimation.fillMode = kCAFillModeForwards;


    //雷达圈圈的透明度
    CABasicAnimation *opacityAnimation = [CABasicAnimation animation];
    opacityAnimation.keyPath = @"opacity";

    opacityAnimation.fromValue = @(0.2);
    opacityAnimation.toValue = @(0);
    opacityAnimation.fillMode = kCAFillModeForwards;

    //组动画
    CAAnimationGroup *group = [CAAnimationGroup animation];
    group.animations = @[basicAnimation,opacityAnimation];
    group.duration = 7;
   //动画定时函数属性 先快后慢 
    group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    group.delegate = self;
    //指定的时间段完成后,动画就自动的从层上移除
 group.removedOnCompletion = YES;
    //添加动画到layer
    [shapeLayer addAnimation:group forKey:nil];

}

#pragma mark 动画结束
-(void)animationDidStop:(CAAnimation *)anim     finished:(BOOL)flag
{
     //虽然效果实现了、而且在内存上也基本在25m旁边.但是实现雷达波纹的波浪是一直在创建对象、所以下叙是为了及时释放不用的Shapelayear。
     //此种方法欠妥、后面有时间会做更新
    if (flag) {
        NSLog(@"----");
        //释放动画结束的对象  获取最上层layer
        if ([self.layer.sublayers[0] isKindOfClass:[CAShapeLayer class]]) {
            CAShapeLayer *shaperLayer = (CAShapeLayer *)self.layer.sublayers[0];
            [shaperLayer removeFromSuperlayer];
            shaperLayer = nil;
            NSLog(@"%lu",self.layer.sublayers.count);
        }

    }
}


@end
在VC中调用
//

#import "ViewController.h"
#import "RadarAnimationView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor colorWithRed:23/255.0 green:26/255.0 blue:40/255.0 alpha:1];

    RadarAnimationView *rader = [[RadarAnimationView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
    rader.center = self.view.center;

    rader.backgroundColor = [UIColor lightGrayColor];
    rader.image = [UIImage imageNamed:@"IMG_1314.JPG"];

    //点击按钮时两种状态调用的两种block
    rader.block = ^{

        NSLog(@"1");
    };

    rader.selectBlock = ^{

        NSLog(@"2");
    };

    [self.view addSubview:rader];
}

@end

好了基本实现了。



文/MoreCookies(简书作者)
原文链接:http://www.jianshu.com/p/c99bea074aad
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
2017-05-22 10:57:07 abvedu 阅读数 1255
  • 无人驾驶--从零入门实战视频教程

    无人驾驶实战视频培训课程:涉及无人驾驶入门教程、光学雷达在无人驾驶技术中应用,GPS及惯性传感器在无人驾驶应用、无人驾驶感知系统、强化学习在无人驾驶应用、卷积神经网络在无人驾驶技术应用等内容。 AI的力量在于落地,其中为瞩目的莫过于无人驾驶技术。CSDN学院联合王而川打造《无人驾驶实战课》,目的就是为了降低无人驾驶学习门槛,让更多人能接受到系统前沿的理论知识。课程分为Python+机器学习系统课+无人驾驶入门实战课,三个阶段,层层递进,从零入门!本课程为实战课,其他两方面学习请点击老师头像查看。

    3438 人正在学习 去看看 王而川
没有更多推荐了,返回首页