iOS开发——无网占位图的实现

https://www.jianshu.com/p/d537393fe247

https://github.com/wyzxc/CQPlaceholderView
https://github.com/wyzxc/TableViewNoContentView

先来看一下实际效果:

效果.gif

为什么要使用无网占位图?

为了更好地用户体验。难道没网的时候展示一个空白模板?当然,无网占位图也是一个APP最基本的功能只一。

原理简介:

viewWillAppear时判断是否有网,如果没网,展示无网占位图。点击无网占位图上的重新查看按钮,判断是否有网,如果没网,toast提示。如果有网,移除无网占位图,重新加载数据。

详细讲解:

  • 首先按照设计师的UI图封装一个无网占位图view:CQNoNetworkView,在构造方法里完成
- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        // UI搭建
        [self setUpUI];
    }
    return self;
}
   /** UI搭建 */
  - (void)setUpUI{
    self.backgroundColor = [UIColor whiteColor];

    // 404图片放中间
    UIImageView *noNetworkImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 125, 125)];
    noNetworkImageView.center = CGPointMake(self.width / 2, self.height / 2);
    [self addSubview:noNetworkImageView];
    noNetworkImageView.image = [UIImage imageNamed:@"404notfound"];

    // 重新查看按钮
    UIButton *checkButton = [[UIButton alloc]initWithFrame:CGRectMake(0, noNetworkImageView.maxY + 24, 115, 30)];
    checkButton.centerX = self.width / 2;
    [self addSubview:checkButton];
    [checkButton.titleLabel setFont:[UIFont systemFontOfSize:15]];
    checkButton.backgroundColor = [UIColor colorWithRed:0.00 green:0.76 blue:0.66 alpha:1.00];
    [checkButton setTitle:@"重新查看" forState:UIControlStateNormal];
    [checkButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [checkButton addTarget:self action:@selector(checkNetworkButtonClicked) forControlEvents:UIControlEventTouchUpInside];

    // 图片上面的两个label
    UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 20)];
    label1.text = @"刷新一下返回店铺!";
    label1.font = [UIFont systemFontOfSize:14];
    label1.textColor = [UIColor colorWithRed:0.00 green:0.77 blue:0.68 alpha:1.00];
    label1.backgroundColor = [UIColor clearColor];
    label1.textAlignment = NSTextAlignmentCenter;
    [label1 sizeToFit];
    label1.centerX = self.width / 2;
    label1.maxY = noNetworkImageView.y - 21;
    [self addSubview:label1];

    UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 15)];
    label2.text = @"您似乎迷路了";
    label2.font = [UIFont systemFontOfSize:19];
    label2.textColor = [UIColor colorWithRed:0.00 green:0.77 blue:0.67 alpha:1.00];
    label2.backgroundColor = [UIColor clearColor];
    label2.textAlignment = NSTextAlignmentCenter;
    [label2 sizeToFit];
    label2.centerX = self.width / 2;
    label2.maxY = label1.y - 12;
    [self addSubview:label2];
}

  • 处理“重新查看”按钮的逻辑,基本思路是:点击此按钮时,判断是否有网,如果仍旧没网,弹出toast提示用户;如果有网,移除此view,并且,让代理方执行相应代理方法,比如说,重新加载数据。
 /** 重新查看按钮点击 */
  - (void)checkNetworkButtonClicked{
    if ([DateUtil isNetWorkRunning]) {
        // 如果有网,view消失,并且让代理方执行代理方法
        for (CQNoNetworkView *view in [self getCurrentViewController].view.subviews) {
            if ([view isMemberOfClass:[CQNoNetworkView class]]) {
                [view removeFromSuperview];
            }
        }

        // 重新加载数据
        if ([self.delegate respondsToSelector:@selector(reloadData)]) {
            [self.delegate reloadData];
        }
    }else{
        // 如果没网,toast提示
        [CQHud showToastWithMessage:@"请检查你的网络连接"];
    }
}

  • 确定代理方法(点击“重新加载”按钮时,代理方执行的方法),我的是重新加载数据。
@protocol CheckNetworkDelegate <NSObject>
@optional

  /** 重新加载数据 */
  - (void)reloadData;

@end

  /** 无网络时展示的view */
@interface CQNoNetworkView : UIView

@property (nonatomic,weak) id<CheckNetworkDelegate> delegate;

@end

  • 确定代理方。代理方就是执行“重新加载数据”的对象。由于每个viewController都需要在无网时展示无网占位图,所以代理方可以设置为项目的BaseViewController(不要告诉我,你的项目里没有基类??)
@interface BaseViewController ()<CheckNetworkDelegate>

在基类里实现重新加载数据,当然,需要由子类重写,不过如果你的项目架构的比较好,所有viewcontroller的获取数据的方法的方法名都一样,那么就不需要再由子类重写了:

/** 重新加载数据,由子类重写 */
     (void)reloadData{

}

同样在基类里实现弹出无网占位图的方法:

/** 显示无网络view */
- (void)showNoNetworkView{
    // 将导航栏和tabbar留出来
    CQNoNetworkView *noNetworkView = [[CQNoNetworkView alloc]initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight - 49)];
    noNetworkView.delegate = self;
    [self.view addSubview:noNetworkView];
}
  • 在基类的viewWillAppear:里判断网络情况:
// 如果没网,加载无网占位图
    if (![DateUtil isNetWorkRunning]) {
        // 无网加载无网站位图
        [self showNoNetworkView];
    }else{
        // 有网移除所有无网展位图
        for (CQNoNetworkView *view in self.view.subviews) {
            if ([view isMemberOfClass:[CQNoNetworkView class]]) {
                [view removeFromSuperview];
            }
        }
    }
  • 最后,在你的子类里重写“重新加载数据”方法即可:
- (void)reloadData{
    [self getData];
}

总结

此功能主要是代理和基类的运用,合理使用基类能让你少些很多代码。当然有些APP可能不仅有一种网络占位图,这个时候在子类里重写基类里的showNoNetworkView方法即可。以上是我对此功能的一些个人看法,只是简单的实现了这个功能,具体项目中还是要根据项目需求进行必要修改和优化的。但是,思路基本上不变。欢迎各位看官提出意见或建议。

补充两个更加优雅和强大的Demo

UITableView空数据占位图

适用于任何场景的通用占位图

作者:无夜之星辰
链接:https://www.jianshu.com/p/d537393fe247
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/sundaysgarden/p/9452903.html

时间: 2024-08-26 19:23:15

iOS开发——无网占位图的实现的相关文章

iOS 开发仿网易云音乐歌词海报

使用网易云音乐也是一个巧合,我之前一直使用QQ音乐听歌,前几天下 app 手机内存告急.于是就把QQ音乐给卸载掉了,正好晚上朋友圈里有一个朋友用网易云音乐分享了一首歌曲,于是我也就尝试下载了网易云音乐,这一下载就让我从QQ音乐粉转黑了. 从设计的角度来看,网易云音乐的界面简洁,慷慨,不像kugou音乐一打开就是各种广告.让人心烦.也不像QQ音乐那样动不动就各种音质,各种冲钻(不为用户需求考虑.仅仅想赚钱,差评).最关键的是它推荐的歌真是好听,实在是太懂我了,真的是非常用心的在做音乐. 废话不多说

iOS开发无第三方控件的援助达到的效果侧边栏

最近的研究iOS程序侧边栏.渐渐的发现iOS该方案还开始采取风侧边栏格该,QQ,今日头条,Path(Path运营商最早的侧边栏app该,效果说成是Path效果),所以就研究了下. 然后发现Git Hub上有非常多側边栏的控件,这些控件效果也都挺玄的.可是我想找到不用第三方控件自己实现側边栏呢?后来參照这篇blog,然后自己搞了下,算搞清楚了.以下具体介绍一下吧. 1. 首先我们须要在storyboard里面新建3个view controlle,这里也能够是navigation controlle

ios开发-凤凰网的揭层式下拉刷,如何下拉table显示其下面的视图不是背景(已解决)

思路: 1.通过在ScrollDidScroll代理方法中监听contentoffset属性的y值,判断是下拉还是上拉 2.需要的第三方框架SDProgress,实现下拉圆饼填充 3.当圆饼填满即其属性progress=1时,sdorgress隐藏(需要改原码(原码是从父视图移除,由于移除后不好操作,遂先隐藏掉)),并将table的frame,orgine.y值设置为一定高度,为松手后table与控制器顶部保持一定距离以显示动画 4.当圆饼消失时,创建一个UIImageView,并开始动画 5.

李洪强iOS开发之-环信02.2_环信官网下载环信 SDK

李洪强iOS开发之-环信02.2_环信官网下载环信 SDK 移动客服即时通讯云 iOS SDK 当前版本:V3.1.4 2016-07-08 [ 版本历史 ] | 开发指南 | 知识库 | Demo源码 | 最新SDK下载Demo扫码安装 切换至v2.x版本 iOS SDK v2.x 当前版本:V2.2.6 2016-06-28 [ 版本历史 ] | 开发指南 | 知识库 | Demo源码 | 最新SDK下载Demo扫码安装 返回v3.x版本 Android SDK 当前版本:V3.1.4 20

iOS开发范例实战宝典(进阶篇)——互动出版网

这篇是计算机类的优质推荐>>>><iOS开发范例实战宝典(进阶篇)> 以最新的IOS 8为版本编写,内容覆盖了IOS开发的方方面面,通过大量实例提升实战技能,并对书中的重点和难点进行了专门分析. 编辑推荐 *以最新的iOS 8为版本编写,内容覆盖了iOS开发的方方面面* *通过200多个实例提升实战技能,并对书中的重点和难点进行了专门分析 *注重实战:详细讲解了117个iOS开发经典实例,提高实战开发水平 *内容全面:全面介绍了iOS开发中最为常见的14类界面模块 *由

iOS开发范例实战宝典(基础篇)——互动出版网

这篇是计算机类的优质推荐>>>><iOS开发范例实战宝典(基础篇)> 以最新的IOS 8为版本编写,内容覆盖了IOS开发的方方面面,通过大量实例提升实战技能,并对书中的重点和难点进行了专门分析. 编辑推荐 *以最新的iOS 8为版本编写,内容覆盖了iOS开发的方方面面* *通过200多个实例提升实战技能,并对书中的重点和难点进行了专门分析 *注重实战:详细讲解了117个iOS开发经典实例,提高实战开发水平 *内容全面:全面介绍了iOS开发中最为常见的14类界面模块 *由

iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 转载:http://www.cnblogs.com/kenshincui/p/4186022.html#avFoundationCamera --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音

《iOS开发全然上手——使用iOS 7和Xcode 5开发移动与平板应用》之Objective-C新手训练营

编写Hello World应用程序通常被觉得,是学习不论什么编程语言的第一步.在这一章,你将创建iOS版的Hello World应用程序作为起步,高速了解Xcode这个开发iOS应用程序的主要工具. 下一步.你将学习Objective-C的基础知识.在此基础之上.将探索类(class)与对象(object)的知识.它们是构建应用程序的主要基石.与此同一时候,你将创建CarValet应用程序,练习一些类的编写.并学习属性(property)的知识.在本章末尾,你将在指导下完毕编程挑战题以探索子类扩

《iOS开发完全上手——使用iOS 7和Xcode 5开发移动与平板应用》之Objective-C新手训练营

编写Hello World应用程序通常被认为,是学习任何编程语言的第一步.在这一章,你将创建iOS版的Hello World应用程序作为起步,快速了解Xcode这个开发iOS应用程序的主要工具. 下一步,你将学习Objective-C的基础知识.在此基础之上,将探索类(class)与对象(object)的知识,它们是构建应用程序的主要基石.与此同时,你将创建CarValet应用程序,练习一些类的编写,并学习属性(property)的知识.在本章末尾,你将在指导下完成编程挑战题以探索子类扩展的知识