当前位置: 移动技术网 > IT编程>移动开发>IOS > IOS等待时动画效果的实现

IOS等待时动画效果的实现

2019年07月24日  | 移动技术网IT编程  | 我要评论

查询时间或长或短,为了提升用户体验,目前用的比较多的手段之一就是查询等待时添加一个动态等待效果。当我们在请求网络时加载页面时有个动作效果,效果图如下:

源代码可以网上找开源项目coding.net,上面的效果原理为两张图片组合,外面那个则为动画转动,里面的图标则是透明度的变化;主要代码如下:

1:把它封装在easeloadingview里面

@interface easeloadingview : uiview
@property (strong, nonatomic) uiimageview *loopview, *monkeyview;
@property (assign, nonatomic, readonly) bool isloading;
- (void)startanimating;
- (void)stopanimating;
@end
@interface easeloadingview ()
@property (nonatomic, assign) cgfloat loopangle, monkeyalpha, anglestep, alphastep;
@end

@implementation easeloadingview
- (instancetype)initwithframe:(cgrect)frame{
 self = [super initwithframe:frame];
 if (self) {
  self.backgroundcolor = [uicolor clearcolor];
  _loopview = [[uiimageview alloc] initwithimage:[uiimage imagenamed:@"loading_loop"]];
  _monkeyview = [[uiimageview alloc] initwithimage:[uiimage imagenamed:@"loading_monkey"]];
  [_loopview setcenter:self.center];
  [_monkeyview setcenter:self.center];
  [self addsubview:_loopview];
  [self addsubview:_monkeyview];
  [_loopview mas_makeconstraints:^(masconstraintmaker *make) {
   make.center.equalto(self);
  }];
  [_monkeyview mas_makeconstraints:^(masconstraintmaker *make) {
   make.center.equalto(self);
  }];
  _loopangle = 0.0;
  _monkeyalpha = 1.0;
  _anglestep = 360/3;
  _alphastep = 1.0/3.0;
 }
 return self;
}
- (void)startanimating{
 self.hidden = no;
 if (_isloading) {
  return;
 }
 _isloading = yes;
 [self loadinganimation];
}
- (void)stopanimating{
 self.hidden = yes;
 _isloading = no;
}
- (void)loadinganimation{
 static cgfloat duration = 0.25f;
 _loopangle += _anglestep;
 if (_monkeyalpha >= 1.0 || _monkeyalpha <= 0.0) {
  _alphastep = -_alphastep;
 }
 _monkeyalpha += _alphastep;
 [uiview animatewithduration:duration delay:0.0 options:uiviewanimationoptioncurvelinear animations:^{
  cgaffinetransform loopangletransform = cgaffinetransformmakerotation(_loopangle * (m_pi / 180.0f));
  _loopview.transform = loopangletransform;
  _monkeyview.alpha = _monkeyalpha;
 } completion:^(bool finished) {
  if (_isloading && [self superview] != nil) {
   [self loadinganimation];
  }else{
   [self removefromsuperview];
   _loopangle = 0.0;
   _monkeyalpha = 1,0;
   _alphastep = abs(_alphastep);
   cgaffinetransform loopangletransform = cgaffinetransformmakerotation(_loopangle * (m_pi / 180.0f));
   _loopview.transform = loopangletransform;
   _monkeyview.alpha = _monkeyalpha;
  }
 }];
}
@end

注意loadinganimation这里面有动作的处理及透明度的处理,当停止加载后把它自个从当前的视图去除;

2:uiview (common)在uiview扩展类里

#pragma mark loadingview
@property (strong, nonatomic) easeloadingview *loadingview;
- (void)beginloading;
- (void)endloading;
@end
- (void)setloadingview:(easeloadingview *)loadingview{
 [self willchangevalueforkey:@"loadingviewkey"];
 objc_setassociatedobject(self, &loadingviewkey,
        loadingview,
        objc_association_retain_nonatomic);
 [self didchangevalueforkey:@"loadingviewkey"];
}
- (easeloadingview *)loadingview{
 return objc_getassociatedobject(self, &loadingviewkey);
}
- (void)beginloading{
 for (uiview *aview in [self.blankpagecontainer subviews]) {
  if ([aview iskindofclass:[easeblankpageview class]] && !aview.hidden) {
   return;
  }
 }
 if (!self.loadingview) { //初始化loadingview
  self.loadingview = [[easeloadingview alloc] initwithframe:self.bounds];
 }
 [self addsubview:self.loadingview];
 [self.loadingview mas_makeconstraints:^(masconstraintmaker *make) {
  make.self.edges.equalto(self);
 }];
 [self.loadingview startanimating];
}
- (void)endloading{
 if (self.loadingview) {
  [self.loadingview stopanimating];
 }
}

注意:cocoa的kvo模型中,有两种通知观察者的方式,自动通知和手动通知。顾名思义,自动通知由cocoa在属性值变化时自动通知观察者,而手动通知需要在值变化时调用 willchangevalueforkey:和didchangevalueforkey: 方法通知调用者。

3:使用页面调用

- (void)sendrequest{
 [self.view beginloading];
 __weak typeof(self) weakself = self;
 [[coding_netapimanager sharedmanager] request_codefile:_mycodefile withpro:_myproject andblock:^(id data, nserror *error) {
  [weakself.view endloading];
  if (data) {
   weakself.mycodefile = data;
   [weakself refreshcodeviewdata];
  }
  [weakself.view configblankpage:easeblankpagetypeview hasdata:(data != nil) haserror:(error != nil) reloadbuttonblock:^(id sender) {
   [weakself sendrequest];
  }];
 }];
}

其中[self.view beginloading]跟[weakself.view endloading]就可以调用动画效果;

补充:另一种是有很多不同的图片组成的动画效果,可以用每一张图片然后for遍历组成出动作效果;

//设置普通状态的动画图片
 nsmutablearray *idleimages = [nsmutablearray array];
 for (nsuinteger i = 1; i<=60; ++i) {
    uiimage *image = [uiimage imagenamed:[nsstring stringwithformat:@"dropdown_anim__000%zd",i]];
    [idleimages addobject:image];
  [idleimages addobject:image];
 }

以上内容是本文通过ios等待时动画效果的实现,希望对大家有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网