项目中有个加载遮盖,就是全屏的那种,而且不同页面可以采取不同的加载效果,比如支付宝中蚂蚁森林和蚂蚁庄园的就是不一样的效果。现在我将思路和代码封装了一下
这个是主类,加载遮盖框,一般建议放在控制器父类进行再次封住,本人这里为了展示效果,将其抽出来
/**
加载页面的遮盖view
可以扩展多种样式的遮盖
*/
@interface BDLoadingCoverView : UIView
/**为loadingview 做标记,可能一个页面存在多次加载不同接口,针对不同接口灵活判断*/
@property (nonatomic,assign)NSInteger sgin;
@property (nonatomic,weak)id <BDLoadingCoverViewDelegate>delegate;
#pragma mark - 显示遮盖加载
/**
展示遮盖
*/
- (void)showCoverToView:(UIView*)view;
/**
注意;当为BDLoadingAnimationImages时,必须要传入图片数组
*/
- (void)showCoverToView:(UIView*)view animation:(BDLoadingAnimationType)animationType;
/**
消除遮盖
*/
- (void)hideCover;
/**
添加导航条到coverview 上 一般这种遮盖是满屏的,则在某些需求下可以进行添加导航栏
比如加载失败后,可以添加一个,以便用户点击返回
*/
- (void)addTopNaviBarWithColorValue:(UIColor*)color;
#pragma mark - 直接展示结果
/**
根据不同的错误码进行不同的页面展示
*/
- (void)showErrorViewWithErrorNumber:(BDRequestErrorType)errorType;
/**
根页面进行页面加载的遮盖效果
@param errorType 错误类型
@param errorMsg 错误提示语 只针对后台返回的
*/
- (void)showErrorViewWithErrorNumber:(BDRequestErrorType)errorType errorMsg:(NSString*)errorMsg;
@end
可以看出很简单,就是一个显示方法,具体可以看下注释。
目前这里演示效果中自己添加了三种展示效果,
/**
这里可以根据需求进行扩展
*/
typedef NS_ENUM(NSInteger,BDLoadingAnimationType){
/**系统的加载效果*/
BDLoadingAnimationSystem,//default
/**图片动画效果*/
BDLoadingAnimationImages,
/**蚂蚁森林加载效果*/
BDLoadingAnimationMayiSenLing,
};
基本用法->
先是模仿普通的加载效果,这里假设有加载失败和正常:
BDLoadingCoverView *cover = [[BDLoadingCoverView alloc]initWithFrame:self.view.bounds];
cover.sgin = 1;
[cover showCoverToView:self.view animation:self.type];
cover.delegate = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if(self.showFail){
[cover showErrorViewWithErrorNumber:BDRequestErrorTimeOut errorMsg:@"请求超时"];
return ;
}
[cover hideCover];
});
在处理失败后,必须要遵守代理,重新请求,大神可以想想如何在父类直接再次请求,本人之前试过很多次,发现不大好处理,就直接将重新加载等操作用代理回掉出来了。
#pragma mark - BDLoadingCoverViewDelegate
- (void)coverViewBackAction:(BDLoadingCoverView *)loadView
{
[self.navigationController popViewControllerAnimated:YES];
}
- (void)coverViewReloadAction:(BDLoadingCoverView *)loadView
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[loadView hideCover];
});
//这里还可以处理多个异常情况
if(loadView.sgin == 1){
}
}
一般情况下,既然是全屏遮盖加载,假如加载失败,则自己给加上了一个返回导航栏,当然了,如果加载的时候保留了系统导航栏的话,就用不上了。但是全屏加载或许处理起来要方便的多吧。
这样下来,就轻轻松松实现了加载效果咯。附上下载链接
这个是展示效果:
![](https://img.haomeiwen.com/i6476736/2feafe7044b91438.gif)
喜欢的话点个赞吧!
网友评论