标签:任务 dem 期望 lda 颜色 should nbsp 有趣 cal
?????? 以下内容来源于官方源码、 README 文档、测试 Demo 以及个人使用总结 !
[TOC]
DZNEmptyDataSet 是基于 UITableView/UICollectionView 的范畴/扩展(category)类,它可以在空白页面上显示提示信息。
这是 iOS 内建的标准,用于处理空表和集合视图。默认情况下,如果你的表视图是空的,屏幕上什么也不会显示,它给用户的体验不是很好。
使用这个库,你只需要实现一些协议,iOS 就会很好地处理集合视图,然后合理美观地显示出用户信息。
将你的项目添加到列表中 并且提供一张(320px)的效果图。
也被称为 Empty state 或者 Blank Slate。
大多数应用程序会显示内容列表、数据集(在 iOS 程序猿眼里,这里通常指的是 UITableView、UICollectionView。),但有些时候这些页面可能是空白的,特别是对于那些刚创建空账户的新用户来说。 空白界面会对用户造成不知道如何进行下一步操作的困惑,因为用户不知道屏幕空白的原因是错误/Bug、网络异常,还是用户应该自己新建内容以恢复APP的正常状态。
请阅读这篇非常有趣的文章 Designing For The Empty States。
在 iOS 9人机界面指南 1.4.2 中也提及过类似的指引:
如果应用中所有的功能当前都不可用,那么应该显示一些内容来解释当前的情形,并建议用户如何进行后续操作。这部分内容给予了用户以反馈,使用户相信你的应用现在没问题。同时这也可以稳定用户情绪,让他们决定是否要采取纠正措施,继续使用应用,还是切换到另一个应用。
Empty Data Sets 有助于:
这个库已经被设计为不需要通过扩展(extend) UITableView 或 UICollectionView 类的方式来实现了。 使用 UITableViewController 或 UICollectionViewController 类仍然可以奏效。 只要通过遵循 DZNEmptyDataSetSource
和 DZNEmptyDataSetDelegate
协议,您将能够完全自定义应用程序的空状态的内容和外观。
支持 CocoaPods 导入
pod ‘DZNEmptyDataSet‘
完整文档参考:CocoaPods 自动生成文档
#import "UIScrollView+EmptyDataSet.h"
作为框架导入:
#import <DZNEmptyDataSet/UIScrollView+EmptyDataSet.h>
// 遵守 DZNEmptyDataSetSource 、DZNEmptyDataSetDelegate 协议
@interface MainViewController : UITableViewController <DZNEmptyDataSetSource, DZNEmptyDataSetDelegate>
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.emptyDataSetSource = self;
self.tableView.emptyDataSetDelegate = self;
// 删除单元格分隔线的一个小技巧
self.tableView.tableFooterView = [UIView new];
}
- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView {
return [UIImage imageNamed:@"lion"];
}
效果图:
- (NSAttributedString *)titleForEmptyDataSet:(UIScrollView *)scrollView {
NSString *title = @"狮子王";
NSDictionary *attributes = @{
NSFontAttributeName:[UIFont boldSystemFontOfSize:18.0f],
NSForegroundColorAttributeName:[UIColor darkGrayColor]
};
return [[NSAttributedString alloc] initWithString:title attributes:attributes];
}
效果图:
- (NSAttributedString *)descriptionForEmptyDataSet:(UIScrollView *)scrollView {
NSString *text = @"你好,我的名字叫辛巴,大草原是我的家!";
NSMutableParagraphStyle *paragraph = [NSMutableParagraphStyle new];
paragraph.lineBreakMode = NSLineBreakByWordWrapping;
paragraph.alignment = NSTextAlignmentCenter;
NSDictionary *attributes = @{
NSFontAttributeName:[UIFont systemFontOfSize:14.0f],
NSForegroundColorAttributeName:[UIColor lightGrayColor],
NSParagraphStyleAttributeName:paragraph
};
return [[NSAttributedString alloc] initWithString:text attributes:attributes];
}
效果图:
- (NSAttributedString *)buttonTitleForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state {
// 设置按钮标题
NSString *buttonTitle = @"喜欢我就点点点点我";
NSDictionary *attributes = @{
NSFontAttributeName:[UIFont boldSystemFontOfSize:17.0f]
};
return [[NSAttributedString alloc] initWithString:buttonTitle attributes:attributes];
}
效果图:
按钮点击高亮效果
- (NSAttributedString *)buttonTitleForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state {
NSString *text = @"Learn more";
UIFont *font = [UIFont systemFontOfSize:15.0];
// 设置默认状态、点击高亮状态下的按钮字体颜色
UIColor *textColor = [UIColor colorWithHex:(state == UIControlStateNormal) ? @"007ee5" : @"48a1ea"];
NSMutableDictionary *attributes = [NSMutableDictionary new];
[attributes setObject:font forKey:NSFontAttributeName];
[attributes setObject:textColor forKey:NSForegroundColorAttributeName];
return [[NSAttributedString alloc] initWithString:text attributes:attributes];
}
效果图:
按钮标题中 点击重试 四个字加粗:
#pragma mark - DZNEmptyDataSetSource
- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView {
return [UIImage imageNamed:@"placeholder_No_Network"];
}
- (NSAttributedString *)buttonTitleForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state {
NSString *text = @"网络不给力,请点击重试哦~";
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
// 设置所有字体大小为 #15
[attStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:15.0]
range:NSMakeRange(0, text.length)];
// 设置所有字体颜色为浅灰色
[attStr addAttribute:NSForegroundColorAttributeName
value:[UIColor lightGrayColor]
range:NSMakeRange(0, text.length)];
// 设置指定4个字体为蓝色
[attStr addAttribute:NSForegroundColorAttributeName
value:HexColor(@"#007EE5")
range:NSMakeRange(7, 4)];
return attStr;
}
- (CGFloat)verticalOffsetForEmptyDataSet:(UIScrollView *)scrollView {
return -70.0f;
}
#pragma mark - DZNEmptyDataSetDelegate
- (void)emptyDataSet:(UIScrollView *)scrollView didTapButton:(UIButton *)button {
// button clicked...
}
- (void)emptyDataSetWillAppear:(UIScrollView *)scrollView {
self.tableView.contentOffset = CGPointZero;
}
效果图
// 空白页显示返回按钮图片
- (UIImage *)buttonImageForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state {
return [UIImage imageNamed:@"placeholder_return"];
}
- (void)emptyDataSet:(UIScrollView *)scrollView didTapButton:(UIButton *)button {
[self.navigationController popViewControllerAnimated:YES];
}
- (nullable UIImage *)buttonBackgroundImageForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state;
- (UIImage *)buttonImageForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state {
return [UIImage imageNamed:@"Image"];
}
效果图:
- (UIColor *)imageTintColorForEmptyDataSet:(UIScrollView *)scrollView {
return [UIColor yellowColor];
}
效果图:就是设置图片颜色,脑补中。。。
- (UIColor *)backgroundColorForEmptyDataSet:(UIScrollView *)scrollView {
UIColor *appleGreenColor = [UIColor colorWithRed:199/255.0 green:237/255.0 blue:204/255.0 alpha:1.0];
return appleGreenColor;
}
效果图:
- (UIView *)customViewForEmptyDataSet:(UIScrollView *)scrollView {
UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[activityView startAnimating];
return activityView;
}
效果图:
#pragma mark - DZNEmptyDataSetSource
#pragma mark 设置空白页图片
- (nullable UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView {
return [UIImage imageNamed:@"lion"];
}
#pragma mark 设置图片动画: 旋转
- (CAAnimation *)imageAnimationForEmptyDataSet:(UIScrollView *)scrollView {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath: @"transform"];
animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 0.0, 0.0, 1.0)];
animation.duration = 0.25;
animation.cumulative = YES;
animation.repeatCount = MAXFLOAT;
return animation;
}
#pragma mark - DZNEmptyDataSetDelegate
// 向代理请求图像视图动画权限。 默认值为NO。
// 确保从 imageAnimationForEmptyDataSet 返回有效的CAAnimation对象:
- (BOOL)emptyDataSetShouldAnimateImageView:(UIScrollView *)scrollView {
return YES;
}
效果图:
#pragma mark - DZNEmptyDataSetSource
#pragma mark 设置空白页图片
- (nullable UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView {
return [UIImage imageNamed:@"computer"];
}
#pragma mark 设置图片动画
- (CAAnimation *)imageAnimationForEmptyDataSet:(UIScrollView *)scrollView
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];
animation.duration = 1.25;
animation.cumulative = NO;
animation.repeatCount = MAXFLOAT;
animation.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 45, 45)];
return animation;
}
#pragma mark - DZNEmptyDataSetDelegate
- (BOOL)emptyDataSetShouldAnimateImageView:(UIScrollView *)scrollView {
return YES;
}
效果图:
空白视图默认情况下显示一张【静态图片】,当用户点击【静态图片】以后,该图片会被替换成【加载转圈】。
通过阅读源码,可以发现它是这样工作的:
@property (nonatomic, getter=isLoading) BOOL loading;
- (void)setLoading:(BOOL)loading
{
if (self.isLoading == loading) {
return;
}
_loading = loading;
// 每次 loading 状态被修改,就刷新空白页面。
[self.tableView reloadEmptyDataSet];
}
接下来要实现几个关联协议
#pragma mark - DZNEmptyDataSetSource
#pragma mark 设置空白页图片
- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView {
if (self.isLoading) {
// 圆形加载图片
return [UIImage imageNamed:@"loading_imgBlue_78x78"];
}else {
// 默认静态图片
return [UIImage imageNamed:@"staticImage"];
}
}
#pragma mark 图片旋转动画
- (CAAnimation *)imageAnimationForEmptyDataSet:(UIScrollView *)scrollView
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
animation.toValue = [NSValue valueWithCATransform3D: CATransform3DMakeRotation(M_PI_2, 0.0, 0.0, 1.0) ];
animation.duration = 0.25;
animation.cumulative = YES;
animation.repeatCount = MAXFLOAT;
return animation;
}
#pragma mark - DZNEmptyDataSetDelegate
#pragma mark 是否开启动画
- (BOOL)emptyDataSetShouldAnimateImageView:(UIScrollView *)scrollView {
return self.isLoading;
}
#pragma mark 空白页面被点击时刷新页面
- (void)emptyDataSet:(UIScrollView *)scrollView didTapView:(UIView *)view {
// 空白页面被点击时开启动画,reloadEmptyDataSet
self.loading = YES;
// 执行加载任务...
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 任务加载完成后关闭动画,reloadEmptyDataSet
self.loading = NO;
});
}
// 向上偏移量为表头视图高度/2
- (CGFloat)verticalOffsetForEmptyDataSet:(UIScrollView *)scrollView {
return -self.tableView.tableHeaderView.frame.size.height/2.0f;
}
// 或者,返回固定值
- (CGFloat)verticalOffsetForEmptyDataSet:(UIScrollView *)scrollView {
return -64;
}
效果图:
- (CGFloat)spaceHeightForEmptyDataSet:(UIScrollView *)scrollView {
return 25.0f;
}
效果图:
- (BOOL)emptyDataSetShouldDisplay:(UIScrollView *)scrollView {
return YES;
}
- (BOOL)emptyDataSetShouldFadeIn:(UIScrollView *)scrollView {
return YES;
}
- (BOOL)emptyDataSetShouldBeForcedToDisplay:(UIScrollView *)scrollView;
- (BOOL)emptyDataSetShouldAllowTouch:(UIScrollView *)scrollView {
// 如果正在加载中,则不响应用户交互。
return !self.isLoading;
}
- (BOOL)emptyDataSetShouldAllowScroll:(UIScrollView *)scrollView;
- (BOOL)emptyDataSetShouldAnimateImageView:(UIScrollView *)scrollView {
return YES;
}
- (void)emptyDataSet:(UIScrollView *)scrollView didTapView:(UIView *)view {
// 处理视图点击事件...
}
- (void)emptyDataSet:(UIScrollView *)scrollView didTapButton:(UIButton *)button {
// 处理按钮点击事件...
}
- (void)emptyDataSetWillAppear:(UIScrollView *)scrollView {
// 如果你的空白占位图与需求向左,发生偏移,可如下设置:
self.tableView.contentOffset = CGPointZero;
}
- (void)emptyDataSetDidAppear:(UIScrollView *)scrollView;
- (void)emptyDataSetWillDisappear:(UIScrollView *)scrollView;
- (void)emptyDataSetDidDisappear:(UIScrollView *)scrollView;
如果你需要刷新空白页面布局,只需调用:
[self.tableView reloadData];
或者
[self.collectionView reloadData];
这取决于你用的是哪一个。
你还可以调用 [self.tableView reloadEmptyDataSet]
以使当前空白页面布局无效,并触发布局更新,绕过 -reloadData
。 如果你的数据源上有很多逻辑处理,当你不需要或者想避免调用 -reloadData
时这可能很有用。 当使用 UIScrollView 时, [self.scrollView reloadEmptyDataSet]
是刷新内容的唯一方法。
标签:任务 dem 期望 lda 颜色 should nbsp 有趣 cal
原文地址:https://www.cnblogs.com/dalianmengzi/p/9860909.html