LineAnimationView
效果
说明
水平循环无间隔播放动画效果,用于loading的界面
源码
https://github.com/YouXianMing/UI-Component-Collection
//
// LineAnimationView.h
// AnimationLine
//
// Created by YouXianMing on 15/7/4.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import <UIKit/UIKit.h> typedef enum : NSUInteger { /**
* 从左往右(默认)
*/
LEFT_TO_RIGHT, /**
* 从右往左
*/
RIGHT_TO_LEFT, } ELineAnimationType; @interface LineAnimationView : UIView /**
* 动画时间间隔(默认时间为 1 秒)
*/
@property (nonatomic) NSTimeInterval duration; /**
* 动画类型(默认为从左到右)
*/
@property (nonatomic) ELineAnimationType animationType; /**
* 素材图片
*/
@property (nonatomic, strong) UIImage *sourceImage; /**
* 开始执行动画
*/
- (void)startAnimation; @end
//
// LineAnimationView.m
// AnimationLine
//
// Created by YouXianMing on 15/7/4.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import "LineAnimationView.h" @interface LineAnimationView () @property (nonatomic, strong) UIView *contentView; @property (nonatomic, strong) UIImageView *leftImageView;
@property (nonatomic, strong) UIImageView *rightImageView; @end @implementation LineAnimationView #pragma mark - 初始化
- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame];
if (self) { [self defaultConfig]; [self setup];
} return self;
} - (void)defaultConfig { self.layer.masksToBounds = YES;
} - (void)setup { CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height; self.contentView = [[UIView alloc] initWithFrame:CGRectMake(, , width * , height)];
[self addSubview:self.contentView]; self.leftImageView = [[UIImageView alloc] initWithFrame:CGRectMake(, , width, height)];
[self.contentView addSubview:self.leftImageView]; self.rightImageView = [[UIImageView alloc] initWithFrame:CGRectMake(width, , width, height)];
[self.contentView addSubview:self.rightImageView]; _animationType = LEFT_TO_RIGHT;
_duration = .f;
} #pragma mark - 开始动画
- (void)startAnimation { if (_animationType == LEFT_TO_RIGHT) { CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height; CGRect startRect = CGRectMake(, , width * , height);
CGRect endRect = CGRectMake(-width, , width * , height); _contentView.frame = startRect; CABasicAnimation *line = [CABasicAnimation animationWithKeyPath:@"bounds"];
line.fromValue = [NSValue valueWithCGRect:startRect];
line.toValue = [NSValue valueWithCGRect:endRect];
line.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
line.duration = _duration;
line.delegate = self; _contentView.frame = endRect;
[_contentView.layer addAnimation:line forKey:nil]; } else if (_animationType == RIGHT_TO_LEFT) { CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height; CGRect startRect = CGRectMake(- width, , width * , height);
CGRect endRect = CGRectMake(, , width * , height); _contentView.frame = startRect; CABasicAnimation *line = [CABasicAnimation animationWithKeyPath:@"bounds"];
line.fromValue = [NSValue valueWithCGRect:startRect];
line.toValue = [NSValue valueWithCGRect:endRect];
line.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
line.duration = _duration;
line.delegate = self; _contentView.frame = startRect;
[_contentView.layer addAnimation:line forKey:nil]; }
} - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { [self startAnimation];
} #pragma mark - 重写setter,getter方法
@synthesize sourceImage = _sourceImage;
- (void)setSourceImage:(UIImage *)sourceImage { _sourceImage = sourceImage;
_leftImageView.image = sourceImage;
_rightImageView.image = sourceImage;
} - (UIImage *)sourceImage { return _sourceImage;
} @end
细节