LineAnimationView

效果

说明

水平循环无间隔播放动画效果,用于loading的界面

源码

https://github.com/YouXianMing/UI-Component-Collection

  1. //
  2. // LineAnimationView.h
  3. // AnimationLine
  4. //
  5. // Created by YouXianMing on 15/7/4.
  6. // Copyright (c) 2015年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import <UIKit/UIKit.h>
  10.  
  11. typedef enum : NSUInteger {
  12.  
  13. /**
  14. * 从左往右(默认)
  15. */
  16. LEFT_TO_RIGHT,
  17.  
  18. /**
  19. * 从右往左
  20. */
  21. RIGHT_TO_LEFT,
  22.  
  23. } ELineAnimationType;
  24.  
  25. @interface LineAnimationView : UIView
  26.  
  27. /**
  28. * 动画时间间隔(默认时间为 1 秒)
  29. */
  30. @property (nonatomic) NSTimeInterval duration;
  31.  
  32. /**
  33. * 动画类型(默认为从左到右)
  34. */
  35. @property (nonatomic) ELineAnimationType animationType;
  36.  
  37. /**
  38. * 素材图片
  39. */
  40. @property (nonatomic, strong) UIImage *sourceImage;
  41.  
  42. /**
  43. * 开始执行动画
  44. */
  45. - (void)startAnimation;
  46.  
  47. @end
  1. //
  2. // LineAnimationView.m
  3. // AnimationLine
  4. //
  5. // Created by YouXianMing on 15/7/4.
  6. // Copyright (c) 2015年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import "LineAnimationView.h"
  10.  
  11. @interface LineAnimationView ()
  12.  
  13. @property (nonatomic, strong) UIView *contentView;
  14.  
  15. @property (nonatomic, strong) UIImageView *leftImageView;
  16. @property (nonatomic, strong) UIImageView *rightImageView;
  17.  
  18. @end
  19.  
  20. @implementation LineAnimationView
  21.  
  22. #pragma mark - 初始化
  23. - (instancetype)initWithFrame:(CGRect)frame {
  24.  
  25. self = [super initWithFrame:frame];
  26. if (self) {
  27.  
  28. [self defaultConfig];
  29.  
  30. [self setup];
  31. }
  32.  
  33. return self;
  34. }
  35.  
  36. - (void)defaultConfig {
  37.  
  38. self.layer.masksToBounds = YES;
  39. }
  40.  
  41. - (void)setup {
  42.  
  43. CGFloat width = self.frame.size.width;
  44. CGFloat height = self.frame.size.height;
  45.  
  46. self.contentView = [[UIView alloc] initWithFrame:CGRectMake(, , width * , height)];
  47. [self addSubview:self.contentView];
  48.  
  49. self.leftImageView = [[UIImageView alloc] initWithFrame:CGRectMake(, , width, height)];
  50. [self.contentView addSubview:self.leftImageView];
  51.  
  52. self.rightImageView = [[UIImageView alloc] initWithFrame:CGRectMake(width, , width, height)];
  53. [self.contentView addSubview:self.rightImageView];
  54.  
  55. _animationType = LEFT_TO_RIGHT;
  56. _duration = .f;
  57. }
  58.  
  59. #pragma mark - 开始动画
  60. - (void)startAnimation {
  61.  
  62. if (_animationType == LEFT_TO_RIGHT) {
  63.  
  64. CGFloat width = self.frame.size.width;
  65. CGFloat height = self.frame.size.height;
  66.  
  67. CGRect startRect = CGRectMake(, , width * , height);
  68. CGRect endRect = CGRectMake(-width, , width * , height);
  69.  
  70. _contentView.frame = startRect;
  71.  
  72. CABasicAnimation *line = [CABasicAnimation animationWithKeyPath:@"bounds"];
  73. line.fromValue = [NSValue valueWithCGRect:startRect];
  74. line.toValue = [NSValue valueWithCGRect:endRect];
  75. line.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
  76. line.duration = _duration;
  77. line.delegate = self;
  78.  
  79. _contentView.frame = endRect;
  80. [_contentView.layer addAnimation:line forKey:nil];
  81.  
  82. } else if (_animationType == RIGHT_TO_LEFT) {
  83.  
  84. CGFloat width = self.frame.size.width;
  85. CGFloat height = self.frame.size.height;
  86.  
  87. CGRect startRect = CGRectMake(- width, , width * , height);
  88. CGRect endRect = CGRectMake(, , width * , height);
  89.  
  90. _contentView.frame = startRect;
  91.  
  92. CABasicAnimation *line = [CABasicAnimation animationWithKeyPath:@"bounds"];
  93. line.fromValue = [NSValue valueWithCGRect:startRect];
  94. line.toValue = [NSValue valueWithCGRect:endRect];
  95. line.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
  96. line.duration = _duration;
  97. line.delegate = self;
  98.  
  99. _contentView.frame = startRect;
  100. [_contentView.layer addAnimation:line forKey:nil];
  101.  
  102. }
  103. }
  104.  
  105. - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
  106.  
  107. [self startAnimation];
  108. }
  109.  
  110. #pragma mark - 重写settergetter方法
  111. @synthesize sourceImage = _sourceImage;
  112. - (void)setSourceImage:(UIImage *)sourceImage {
  113.  
  114. _sourceImage = sourceImage;
  115. _leftImageView.image = sourceImage;
  116. _rightImageView.image = sourceImage;
  117. }
  118.  
  119. - (UIImage *)sourceImage {
  120.  
  121. return _sourceImage;
  122. }
  123.  
  124. @end

细节

[控件] LineAnimationView的更多相关文章

  1. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  2. HTML5 progress和meter控件

    在HTML5中,新增了progress和meter控件.progress控件为进度条控件,可表示任务的进度,如Windows系统中软件的安装.文件的复制等场景的进度.meter控件为计量条控件,表示某 ...

  3. 百度 flash html5自切换 多文件异步上传控件webuploader基本用法

    双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name=& ...

  4. JS与APP原生控件交互

    "热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...

  5. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

  6. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  7. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  8. Windows API 设置窗口下控件Enable属性

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...

  9. VB.NET设置控件和窗体的显示级别

    前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...

随机推荐

  1. hadoop学习笔记(三):hadoop文件结构

    hadoop完整安装目录结构: 比较重要的包有以下4个: src hadoop源码包.最核心的代码所在目录为core.hdfs和mapred,他们分别实现了hadoop最重要的3个模块:基础公共库.H ...

  2. Vue双向绑定的关键:Object.defineProperty()

    这个方法了不起啊.vue.js和avalon.js 都是通过它实现双向绑定的.而且Object.observe也被草案发起人撤回了.所以defineProperty更有必要了解一下了. 先上几行代码看 ...

  3. 关于Mysql+EF6本地运行和发布没有问题,发布到服务器上出现问题的解决方案

    这个问题折磨了我差不多两天,网上各种方法也找了个遍,但是都没有解决我的问题,后面通过自己仔细分析问题和排查,终于把问题解决了,以下是我的解决问题的步骤,希望能帮到各位,不要再被这些问题坑了 1,项目实 ...

  4. 解决 windows npm ERR! asyncWrite is not a function 问题

    重装过node,cmd中 node -v,npm -v 提示版本都没有问题,但是在vue项目中npm i 的时候出现了npm ERR! asyncWrite is not a function 问题, ...

  5. C# 进程优先级和线程优先级的方法

    C# 设置进程优先级的方法 this.process1= Process.GetCurrentProcess(); process1.PriorityClass = ProcessPriorityCl ...

  6. Linux学习8-Linux常用命令(4)

    链接命令     命令名称:ln 命令英文原意:link 命令所在路径:/bin/ln 执行权限:所有用户 功能描述:生成链接文件 语法:ln 选项[-s][原文件] [目标文件] 选项: -s 创建 ...

  7. STL:vector<bool> 和bitset

    今天某个地方要用到很多位标记于是想着可以用下bitset,不过发现居然是编译时确定空间的,不能动态分配.那就只能用vector来代替一下了,不过发现居然有vector<bool>这个特化模 ...

  8. python中类的约束和限制对象添加属性

    通过__slots__限制对象可添加的属性 class A: __slots__ = ['a', 'b'] pass a1 = A() a1.a = 10 print(a1.a) a1.c = 0 # ...

  9. jQuery导入及测试

    jQuery导入: <script type="text/javascript" src="js/jquery-3.1.1.min.js">< ...

  10. 基于jQuery的软键盘

    基于jQuery的软键盘   前些天写了一个基于基于jQuery的数字键盘,今天给大家带来一个基于jQuery的全字母键盘插件(支持全字母大小写切换,数字输入,退格清除,关闭功能,可调整大小和键盘位置 ...