示例图片

loading1

 loading2

 loading3

 

实现效果gif图

本文使用的是animateKeyframesWithDuration关键帧动画

[UIView animateKeyframesWithDuration:duration delay:delay

options:options animations:^{

[UIView addKeyframeWithRelativeStartTime:0.0

relativeDuration:0.5 animations:^{

//第一帧要执行的动画

}];

[UIView addKeyframeWithRelativeStartTime:0.5

relativeDuration:0.5 animations:^{

//第二帧要执行的动画

}];

} completion:^(BOOL finished) {

//动画结束后执行的代码块

}];

animateKeyframesWithDuration与animateWithDuration不同,容易打错。如若使用了animateWithDuration则动画效果如下所示

源代码

LoadingView.h

#import

NS_ASSUME_NONNULL_BEGIN

@interface LoadingView : UIView

//是否加载

@property (nonatomic, assign) BOOL isloading;

@end

NS_ASSUME_NONNULL_END

 LoadingView.m

#import "LoadingView.h"

#define kWeakSelf __weak typeof(self) weakSelf = self;

@interface LoadingView ()

@property (nonatomic, strong) UIImageView *loadIcon1;

@property (nonatomic, strong) UIImageView *loadIcon2;

@property (nonatomic, strong) UIImageView *loadIcon3;

@end

@implementation LoadingView

- (instancetype)initWithFrame:(CGRect)frame {

self = [super initWithFrame:frame];

if (self) {

self.loadIcon1.hidden = self.loadIcon2.hidden = self.loadIcon3.hidden = YES;

}

return self;

}

//开始动画

- (void)startAnimations {

CGFloat duration = 2.0;

CGFloat dur = 1.0 / 12;

self.loadIcon1.hidden = self.loadIcon2.hidden = self.loadIcon3.hidden = NO;

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

[UIView animateKeyframesWithDuration:duration delay:0 options:UIViewKeyframeAnimationOptionRepeat | UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{

//关键帧动画 addKeyframeWithRelativeStartTime开始时间 relativeDuration结束动画

[UIView addKeyframeWithRelativeStartTime:0 relativeDuration:dur animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

}];

[UIView addKeyframeWithRelativeStartTime:dur relativeDuration:dur * 2 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(1, 1);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 2 relativeDuration:dur * 3 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(1.3, 1.3);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 3 relativeDuration:dur * 4 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(1, 1);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 4 relativeDuration:dur * 5 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 5 relativeDuration:dur * 6 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(1, 1);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 6 relativeDuration:dur * 7 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(1.3, 1.3);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 7 relativeDuration:dur * 8 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(1, 1);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 8 relativeDuration:dur * 9 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(1, 1);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 9 relativeDuration:dur * 10 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(1.3, 1.3);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 10 relativeDuration:dur * 11 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(1, 1);

}];

[UIView addKeyframeWithRelativeStartTime:dur * 11 relativeDuration:1 animations:^{

self.loadIcon1.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon2.transform = CGAffineTransformMakeScale(0, 0);

self.loadIcon3.transform = CGAffineTransformMakeScale(0, 0);

}];

} completion:^(BOOL finished) {

}];

}

/*懒加载*/

- (UIImageView *)loadIcon1 {

if (!_loadIcon1) {

_loadIcon1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 9, 10)];

[_loadIcon1 setImage:[UIImage imageNamed:@"loadIcon1"]];

[self addSubview:_loadIcon1];

}

return _loadIcon1;

}

- (UIImageView *)loadIcon2 {

if (!_loadIcon2) {

_loadIcon2 = [[UIImageView alloc] initWithFrame:CGRectMake(11, 0, 9, 10)];

_loadIcon2.image = [UIImage imageNamed:@"loadIcon2"];

[self addSubview:_loadIcon2];

}

return _loadIcon2;

}

- (UIImageView *)loadIcon3 {

if (!_loadIcon3) {

_loadIcon3 = [[UIImageView alloc] initWithFrame:CGRectMake(22, 0, 9, 10)];

[_loadIcon3 setImage:[UIImage imageNamed:@"loadIcon3"]];

[self addSubview:_loadIcon3];

}

return _loadIcon3;

}

- (void)setIsloading:(BOOL)isloading {

_isloading = isloading;

if (_isloading) {

[self startAnimations];

} else {

[self.layer removeAllAnimations];

}

}

@end

相关链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。