经常用UITableView,一定会遇到数据为空的情况,这时需要在空页面上放一个图片和一行文字提示数据为空,下面整理了两种方法来实现这个功能。
第一个是继承UITableView,再新类中集成图片和文字
#import <UIKit/UIKit.h>
#import "Const.h"
@interface WFEmptyTableView : UITableView
@property (nonatomic, assign) BOOL showEmptyTipView; // 是否显示背景提示文字
@property (nonatomic, assign) NSInteger vOffset;
@property (nonatomic, copy) NSString *tipString; // 提示文字
@property (nonatomic, copy) NSString *tipImageName; // 提示图片
@end
#import "WFEmptyTableView.h"
@implementation WFEmptyTableView {
UIView *_customBackView;
UIImageView *_tipImageView;
UILabel *_label;
CGRect _imageFrame;
CGRect _labelFrame;
double _scale;
}
- (WFEmptyTableView *)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
self = [super initWithFrame:frame style:style];
if (self) {
[self setupViews];
}
return self;
}
- (void)setupViews {
_customBackView = [[UIView alloc] initWithFrame:self.frame];
_customBackView.backgroundColor = [UIColor yellowColor];
_tipImageView = [[UIImageView alloc] initWithFrame:CGRectMake((kScreenWidth-200/2)/2, self.frame.size.height/3, 200/2, 200/2)];
[_customBackView addSubview:_tipImageView];
_imageFrame = _tipImageView.frame;
_label = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(_tipImageView.frame), kScreenWidth, 100)];
_label.backgroundColor = [UIColor clearColor];
_label.textAlignment = NSTextAlignmentCenter;
_label.textColor = [UIColor lightGrayColor];
_label.font = [UIFont systemFontOfSize:16];
_label.lineBreakMode = NSLineBreakByCharWrapping;
_label.numberOfLines = 0;
[_customBackView addSubview:_label];
_labelFrame = _label.frame;
}
- (void)setShowEmptyTipView:(BOOL)showEmptyTipView {
_showEmptyTipView = showEmptyTipView;
if (showEmptyTipView) {
[self addSubview:_customBackView];
} else {
[_customBackView removeFromSuperview];
}
}
- (void)setTipString:(NSString *)tipString {
_tipString = tipString;
NSMutableAttributedString * attributedString1 = [[NSMutableAttributedString alloc] initWithString:tipString];
NSMutableParagraphStyle * paragraphStyle1 = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle1 setLineSpacing:15];
[paragraphStyle1 setAlignment:NSTextAlignmentCenter];
[attributedString1 addAttribute:NSParagraphStyleAttributeName value:paragraphStyle1 range:NSMakeRange(0, [tipString length])];
[_label setAttributedText:attributedString1];
[self resetFrame];
}
- (void)setTipImageName:(NSString *)tipImageName {
_scale = 1;
UIImage *image = [UIImage imageNamed:tipImageName];
_scale = image.size.height*1.0 / image.size.width;
_tipImageView.image = image;
if (isnan(_scale)) {
_scale = 1;
}
[self resetFrame];
}
- (void)setVOffset:(NSInteger)vOffset {
_label.frame = CGRectMake(CGRectGetMinX(_label.frame), CGRectGetMinY(_label.frame)+vOffset, CGRectGetWidth(_label.frame), CGRectGetHeight(_label.frame));
_tipImageView.frame = CGRectMake(CGRectGetMinX(_tipImageView.frame), CGRectGetMinY(_tipImageView.frame)+vOffset, CGRectGetWidth(_tipImageView.frame), CGRectGetHeight(_tipImageView.frame));
}
- (void)resetFrame {
_tipImageView.frame = CGRectMake(0, CGRectGetMinY(_tipImageView.frame), 150, 150 * _scale);
_tipImageView.center = CGPointMake(kScreenWidth / 2.0, _tipImageView.center.y);
_label.frame = CGRectMake(CGRectGetMinX(_label.frame), CGRectGetMaxY(_tipImageView.frame), CGRectGetWidth(_label.frame), CGRectGetHeight(_label.frame));
}
@end
还有一种方法,是用Category
#import <UIKit/UIKit.h>
@interface UITableView (WFEmpty)
@property (nonatomic, strong, readonly) UIView *emptyView;
-(void)addEmptyViewWithImageName:(NSString*)imageName title:(NSString*)title;
@end
#import "UITableView+WFEmpty.h"
#import <objc/runtime.h>
static char UITableViewEmptyView;
@implementation UITableView (WFEmpty)
@dynamic emptyView;
- (UIView *)emptyView
{
return objc_getAssociatedObject(self, &UITableViewEmptyView);
}
- (void)setEmptyView:(UIView *)emptyView
{
[self willChangeValueForKey:@"HJEmptyView"];
objc_setAssociatedObject(self, &UITableViewEmptyView,
emptyView,
OBJC_ASSOCIATION_ASSIGN);
[self didChangeValueForKey:@"HJEmptyView"];
}
-(void)addEmptyViewWithImageName:(NSString*)imageName title:(NSString*)title
{
if (!self.emptyView)
{
CGRect frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
UIImage* image = [UIImage imageNamed:imageName];
NSString* text = title;
UIView* noMessageView = [[UIView alloc] initWithFrame:frame];
noMessageView.backgroundColor = [UIColor clearColor];
UIImageView *carImageView = [[UIImageView alloc] initWithFrame:CGRectMake((frame.size.width-image.size.width)/2, 60, image.size.width, image.size.height)];
[carImageView setImage:image];
[noMessageView addSubview:carImageView];
UILabel *noInfoLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 160, frame.size.width, 20)];
noInfoLabel.textAlignment = NSTextAlignmentCenter;
noInfoLabel.textColor = [UIColor lightGrayColor];
noInfoLabel.text = text;
noInfoLabel.backgroundColor = [UIColor clearColor];
noInfoLabel.font = [UIFont systemFontOfSize:20];
[noMessageView addSubview:noInfoLabel];
[self addSubview:noMessageView];
self.emptyView = noMessageView;
}
}
@end
源码地址: github