duwenquan-方形LOGO.png
引述
我們在使用淘寶的時候,在我的訂單頁面,如果沒有相應的訂單狀態,會有相應的提示,如下圖為淘寶無訂單時候的頁面顯示
IMG_8963.PNG
其實,在我們整個的iOS開發過程中,不止這里會用到,當我們任何一個頁面再沒有數據時候都會有一個提示頁,增加用戶體驗。于是本人對齊進行了封裝,真正做到了哪里用到哪里調,簡單的一行代碼就可以完成這個效果。
DWQEmptyView
每個人的實現方式不同,我是通過為UIvew添加分類,結合Runtime動態添加屬性的方法實現空白視圖效果的。實現原理主要點
- 1.在UIView分類的 .m 文件中關聯對象(動態添加屬性)
//DWQErrorPageView
- (void)setErrorPageView:(DWQErrorPageView *)errorPageView{
[self willChangeValueForKey:NSStringFromSelector(@selector(errorPageView))];
objc_setAssociatedObject(self, @selector(errorPageView), errorPageView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self didChangeValueForKey:NSStringFromSelector(@selector(errorPageView))];
}
- (DWQErrorPageView *)errorPageView{
return objc_getAssociatedObject(self, _cmd);
}
ruantime方法介紹
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
id object : 表示關聯者,是一個對象
const void key: 獲取被關聯者的索引key
id value : 被關聯者
objc_AssociationPolicy policy : 關聯時采用的協議,有assign,retain,copy等協議,一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC
- 2.創建空白視圖
- (instancetype)init{
return [self initWithFrame:CGRectZero];
}
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor whiteColor];
UIImageView* errorImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"DWQBlankPage"]];
_errorImageView = errorImageView;
[self addSubview:_errorImageView];
UILabel* errorTipLabel = [[UILabel alloc]init];
errorTipLabel.numberOfLines = 1;
errorTipLabel.font = [UIFont systemFontOfSize:16];
errorTipLabel.textAlignment = NSTextAlignmentCenter;
errorTipLabel.textColor = [UIColor darkGrayColor];
errorTipLabel.text = @"杜文全提醒:您的網絡在開小差哦~";
_errorTipLabel = errorTipLabel;
[self addSubview:_errorTipLabel];
UIButton* reloadButton = [UIButton buttonWithType:UIButtonTypeCustom];
reloadButton.layer.masksToBounds = YES;
reloadButton.layer.cornerRadius = 20;
[reloadButton setTitle:@" 點擊刷新" forState:UIControlStateNormal];
reloadButton.titleLabel.font =[UIFont systemFontOfSize:15];
[reloadButton setImage:[UIImage imageNamed:@"DWQupdate" ] forState:UIControlStateNormal];
reloadButton.backgroundColor = [UIColor lightGrayColor];
[reloadButton addTarget:self action:@selector(_clickReloadButton:) forControlEvents:UIControlEventTouchUpInside];
_reloadButton = reloadButton;
[self addSubview:_reloadButton];
[_errorImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self);
make.centerY.equalTo(self.mas_centerY).offset(-30);
}];
[_errorTipLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self);
make.height.equalTo(@20);
make.top.equalTo(_errorImageView.mas_bottom);
}];
[_reloadButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(LSCREENW-60);
make.height.mas_equalTo(40);
make.centerX.equalTo(self);
make.bottom.equalTo(self.mas_bottom).offset(-30);
}];
}
return self;
}
- 3.點擊按鈕刷新的實現,也是通過Runtime動態添加block屬性來實現
- (DWQErrorPageView *)errorPageView{
return objc_getAssociatedObject(self, _cmd);
}
- (void)configReloadAction:(void (^)())block{
self.reloadAction = block;
if (self.errorPageView && self.reloadAction) {
self.errorPageView.didClickReloadBlock = self.reloadAction;
}
}
使用方法
1.在需要使用的控制器或者PCH文件中引入頭文件
#import "UIView+DWQEmptyView.h"
2.使用self.view 調用方法,代碼示例如下:
// //如果無網絡
// [self.view showErrorPageView];
// [self.view configReloadAction:^{
// NSLog(@"點擊我就可以刷新了啊");
// }];
//空數據
[self.view showBlankPageView];
//隱藏
//[self.view hideBlankPageView];
效果圖展示:
效果展示.jpg
控件下載地址
覺得不錯的小伙伴給個贊,在GitHub上給個Star噢!!!~~~~