iOS tableView无数据 占位图封装

适用于各种无数据view显示

SYLoadingResultView.h
#import <UIKit/UIKit.h>

typedef NS_ENUM(NSUInteger, SYLoadingResultStyle) {
    SYLoadingResultDefault, //两个标题一个按钮(默认)
    SYLoadingResultImageTitleBtn, //一张图片、一个标题、一个按钮
    SYLoadingResultImageTitle, //一张图片、一个标题。
    SYLoadingResultImageTwoTitle, //一张图片、两个标题
    SYLoadingResultImageTwoTitleBtn, //一张图片、两个标题、一个按钮
};

@protocol SYLoadingResultViewDeleagte <NSObject>

@optional
- (void)loadingResultViewBtnClicked:(UIButton *)sender;

@end

typedef void(^callBackBlock)(UIButton *btn);

@interface SYLoadingResultView : UIView

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

+ (SYLoadingResultView *)showLoadingResultOnView:(UIView *)view withBlock:(callBackBlock)block;

+ (SYLoadingResultView *)showLoadingResultOnView:(UIView *)View withStyle:(SYLoadingResultStyle)style withBlock:(callBackBlock)block;


+ (SYLoadingResultView *)showNotDataWithOnView:(UIView *)view;
+ (SYLoadingResultView *)showLoadingResultView:(UIView *)view reloadBlock:(callBackBlock)block;

+ (void)dismissOnView:(UIView *)view;

- (void)setUpCallBackBlock:(callBackBlock)block;

- (void)setMainTitleStr:(NSString *)string;
- (void)setMainTitleAttriStr:(NSAttributedString *)attriStr;

- (void)setSubTitleStr:(NSString *)string;
- (void)setSubTitleAttriStr:(NSAttributedString *)attriStr;

- (void)setImg:(UIImage *)image;

- (void)setBtnStr:(NSString *)BtnStr;

- (void)setContentViewBackgroundColor:(UIColor *)backgroundColor;

- (void)setContainerViewCenterY:(CGFloat)centerY;

@end




SYLoadingResultView.m

#import "SYLoadingResultView.h"
#import "Masonry.h"

//static NSString *const defaultMainLabelStr = @"数据加载失败";
//static NSString *const defaultSubLabelStr = @"请检查您的手机是否联网,点击按钮重新加载";
//static NSString *const defaultBtnStr = @"重新加载";


static NSString * defaultMainLabelStr = @"数据加载失败";
static NSString * defaultSubLabelStr = @"请检查您的手机是否联网,点击按钮重新加载";
static NSString * defaultBtnStr = @"重新加载";



@interface SYLoadingResultView ()

@property (nonatomic, assign) SYLoadingResultStyle style;
@property (nonatomic, assign) CGFloat containerCenterY;
@property (nonatomic, strong) UIView *backgroundView;
@property (nonatomic, strong) UIView *containerView;
@property (nonatomic, strong) UIImageView *imageView;
@property (nonatomic, strong) UILabel *mainLabel;
@property (nonatomic, strong) UILabel *subLabel;
@property (nonatomic, strong) UIButton *button;
@property (nonatomic, copy) callBackBlock clickBlock;

@end

@implementation SYLoadingResultView

#pragma mark - LifeCycle

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [self initWithStyle:SYLoadingResultDefault withFrame:frame];
    return self;
}

- (instancetype)initWithStyle:(SYLoadingResultStyle)style
{
    self = [self initWithStyle:style withFrame:CGRectZero];
    return self;
}

- (instancetype)initWithStyle:(SYLoadingResultStyle)style withFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        defaultMainLabelStr = JDLocalized(@"errorPage_title", nil);
        defaultSubLabelStr  = JDLocalized(@"errorPage_tip", nil);
        defaultBtnStr       = JDLocalized(@"errorPage_btnText", nil);
        
        _style = style;
        _containerCenterY = 0;
        
        _backgroundView = [UIView new];
        _backgroundView.backgroundColor = JDColor(0xf5f5f5);
        
        _containerView = [UIView new];
        _containerView.backgroundColor = JDColor(0xf5f5f5);
        
        _imageView = [UIImageView new];
        _imageView.image = [UIImage imageNamed:@"No-net"];
        
        _mainLabel = [UILabel new];
        _mainLabel.text = defaultMainLabelStr;
        _mainLabel.font = [UIFont systemFontOfSize:17];
        _mainLabel.textColor = JDColor(0x333333);
        _mainLabel.textAlignment = NSTextAlignmentCenter;
        _mainLabel.numberOfLines = 0;
        switch (style) {
            case SYLoadingResultDefault:
                _mainLabel.text = defaultMainLabelStr;
                break;
            case SYLoadingResultImageTitleBtn:
                _mainLabel.text = defaultMainLabelStr;
                break;
            case SYLoadingResultImageTitle:
                _mainLabel.text = defaultMainLabelStr;
                break;
            case SYLoadingResultImageTwoTitle:
                _mainLabel.text = defaultMainLabelStr;
                break;
            default:
                break;
        }
        
        _subLabel = [UILabel new];
        _subLabel.text = defaultSubLabelStr;
        _subLabel.font = [UIFont systemFontOfSize:13];
        _subLabel.textColor = JDColor(0x999999);
        _subLabel.textAlignment = NSTextAlignmentCenter;
        _subLabel.numberOfLines = 0;
        
        _button = [UIButton buttonWithType:UIButtonTypeCustom];
        [_button setTitle:defaultBtnStr forState:UIControlStateNormal];
        [_button setTitleColor:JDColor(0xe6454a) forState:UIControlStateNormal];
        [_button setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
        UIImage *reloadBtnImg = [UIImage imageNamed:@"Roundbutton"];
        reloadBtnImg = [reloadBtnImg resizableImageWithCapInsets:UIEdgeInsetsMake(2, 19, 2, 19)
                                                    resizingMode:UIImageResizingModeStretch];
        [_button setBackgroundImage:reloadBtnImg forState:UIControlStateNormal];
        UIImage *reloadSelBtnImg = [UIImage imageNamed:@"RoundbuttonSelected"];
        reloadSelBtnImg = [reloadSelBtnImg resizableImageWithCapInsets:UIEdgeInsetsMake(2, 19, 2, 19)
                                                          resizingMode:UIImageResizingModeStretch];
        [_button setBackgroundImage:reloadSelBtnImg forState:UIControlStateHighlighted];
        [_button addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

- (void)updateConstraints
{
    [self addSubview:self.backgroundView];
    [self.backgroundView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.edges.mas_equalTo(UIEdgeInsetsZero);
    }];
    
    [self updateConstraintsWithStyle:self.style];
    
    [self addSubview:self.containerView];
    [self.containerView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.centerY.mas_equalTo(self.containerCenterY);
    }];
    
    [super updateConstraints];
}

- (void)updateConstraintsWithStyle:(SYLoadingResultStyle)style
{
    [self.containerView removeAllSubviews];
    switch (style) {
        case SYLoadingResultDefault:
        {
            [self.containerView addSubview:self.mainLabel];
            [self.mainLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.left.right.mas_equalTo(0);
            }];
            
            [self.containerView addSubview:self.subLabel];
            [self.subLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.mainLabel.mas_bottom).mas_offset(10);
                make.left.right.mas_equalTo(0);
            }];
            
            [self.containerView addSubview:self.button];
            [self.button mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.subLabel.mas_bottom).mas_offset(20);
                make.centerX.mas_equalTo(0);
                make.size.mas_equalTo(CGSizeMake(150, 40));
                make.bottom.mas_equalTo(0);
            }];
        }
            break;
        case SYLoadingResultImageTitleBtn:
        {
            [self.containerView addSubview:self.imageView];
            [self.imageView mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_offset(0);
                make.centerX.mas_equalTo(self.containerView.mas_centerX);
                make.size.mas_equalTo(self.imageView.image.size);
            }];
            
            [self.containerView addSubview:self.mainLabel];
            [self.mainLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.imageView.mas_bottom).mas_offset(10);
                make.left.right.mas_equalTo(0);
            }];
            
            [self.containerView addSubview:self.button];
            [self.button mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.mainLabel.mas_bottom).mas_offset(20);
                make.size.mas_equalTo(CGSizeMake(150, 40));
                make.centerX.mas_equalTo(self.containerView.mas_centerX);
                make.bottom.mas_equalTo(0);
            }];
        }
            break;
        case SYLoadingResultImageTitle:
        {
            [self.containerView addSubview:self.imageView];
            [self.imageView mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_offset(0);
                make.centerX.mas_equalTo(self.containerView.mas_centerX);
                make.size.mas_equalTo(self.imageView.image.size);
            }];
            
            [self.containerView addSubview:self.mainLabel];
            [self.mainLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.imageView.mas_bottom).mas_offset(10);
                make.left.right.mas_equalTo(0);
                make.bottom.mas_equalTo(0);
            }];
        }
            break;
        case SYLoadingResultImageTwoTitle:
        {
            [self.containerView addSubview:self.imageView];
            [self.imageView mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_offset(0);
                make.centerX.mas_equalTo(self.containerView.mas_centerX);
                make.size.mas_equalTo(self.imageView.image.size);
            }];
            
            [self.containerView addSubview:self.mainLabel];
            [self.mainLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.imageView.mas_bottom).mas_offset(10);
                make.left.right.mas_equalTo(0);
            }];
            
            [self.containerView addSubview:self.subLabel];
            [self.subLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.mainLabel.mas_bottom).mas_offset(10);
                make.left.right.mas_equalTo(0);
                make.bottom.mas_equalTo(0);
            }];
        }
            break;
        case SYLoadingResultImageTwoTitleBtn:
        {
            [self.containerView addSubview:self.imageView];
            [self.imageView mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_offset(0);
                make.centerX.mas_equalTo(self.containerView.mas_centerX);
                make.size.mas_equalTo(self.imageView.image.size);
            }];
            
            [self.containerView addSubview:self.mainLabel];
            [self.mainLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.imageView.mas_bottom).mas_offset(10);
                make.left.right.mas_equalTo(0);
            }];

            [self.containerView addSubview:self.subLabel];
            [self.subLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.mainLabel.mas_bottom).mas_offset(10);
                make.left.right.mas_equalTo(0);
            }];

            [self.containerView addSubview:self.button];
            [self.button mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.mas_equalTo(self.subLabel.mas_bottom).mas_offset(20);
                make.size.mas_equalTo(CGSizeMake(150, 40));
                make.centerX.mas_equalTo(self.containerView.mas_centerX);
                make.bottom.mas_equalTo(0);
            }];
        }
            break;
        default:
            break;
    }
}

+ (SYLoadingResultView *)showLoadingResultOnView:(UIView *)view withBlock:(callBackBlock)block
{
    return [SYLoadingResultView showLoadingResultOnView:view withStyle:SYLoadingResultDefault withBlock:block];
}

+ (SYLoadingResultView *)showLoadingResultOnView:(UIView *)View withStyle:(SYLoadingResultStyle)style withBlock:(callBackBlock)block
{
    if (!View) {
        return nil;
    }
    SYLoadingResultView *loadingResultView = [[SYLoadingResultView alloc] initWithStyle:style];
    [View addSubview:loadingResultView];
    [loadingResultView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.edges.mas_equalTo(UIEdgeInsetsZero);
    }];
    
    [loadingResultView setUpCallBackBlock:block];
    
    return loadingResultView;
}

+ (SYLoadingResultView *)showNotDataWithOnView:(UIView *)view
{
    SYLoadingResultView *resultView = [SYLoadingResultView showLoadingResultOnView:view withStyle:SYLoadingResultImageTitle withBlock:nil];
    
    UIImage *img = [UIImage imageNamed:@"error_notdata"];
    [resultView setImg:img];
    
    NSMutableAttributedString *attriStr = [[NSMutableAttributedString alloc] initWithString:@"没有数据记录"];
    [attriStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14.0] range:NSMakeRange(0, attriStr.length)];
    //添加文字背景颜色
    [attriStr addAttribute:NSForegroundColorAttributeName value:JDColor(0x999999) range:NSMakeRange(0, attriStr.length)];
    [resultView setMainTitleAttriStr:attriStr];
    
    [resultView updateConstraintsIfNeeded];
    return resultView;
}

+ (SYLoadingResultView *)showLoadingResultView:(UIView *)view reloadBlock:(callBackBlock)block
{
    
    SYLoadingResultView *resultView = [SYLoadingResultView showLoadingResultOnView:view withStyle:SYLoadingResultImageTitleBtn withBlock:block];
    
    UIImage *img = [UIImage imageNamed:@"error_noNet"];
    [resultView setImg:img];
    
    NSMutableAttributedString *attriStr = [[NSMutableAttributedString alloc] initWithString:@"亲, 您的网络不给力哦!"];
    [attriStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14.0] range:NSMakeRange(0, attriStr.length)];
    //添加文字背景颜色
    [attriStr addAttribute:NSForegroundColorAttributeName value:JDColor(0x999999) range:NSMakeRange(0, attriStr.length)];
    [resultView setMainTitleAttriStr:attriStr];
    
    [resultView setBtnStr:@"刷新看看"];
    
    [resultView updateConstraintsIfNeeded];
    return resultView;
}

+ (void)dismissOnView:(UIView *)view
{
    [view.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj isKindOfClass:[SYLoadingResultView class]]) {
            [obj dismiss];
        }
    }];
}

- (void)dismiss
{
    [self removeFromSuperview];
}

- (void)setContainerViewCenterY:(CGFloat)centerY
{
    self.containerCenterY = centerY;
    [self setNeedsUpdateConstraints];
}

- (void)buttonClicked
{
    if ([self.delegate respondsToSelector:@selector(loadingResultViewBtnClicked:)]) {
        [self.delegate loadingResultViewBtnClicked:self.button];
        [self dismiss];
        return;
    }
    if (self.clickBlock != nil) {
       self.clickBlock(self.button);
        [self dismiss];
    } else {
        [self dismiss];
    }
}

#pragma mark - Setter&Getter

- (void)setUpCallBackBlock:(callBackBlock)block
{
    if (block) {
        self.clickBlock = block;
    }
}

- (void)setMainTitleStr:(NSString *)string
{
    self.mainLabel.text = string;
    [self setNeedsUpdateConstraints];
}

- (void)setMainTitleAttriStr:(NSAttributedString *)attriStr
{
    self.mainLabel.attributedText = attriStr;
    [self setNeedsUpdateConstraints];
}

- (void)setSubTitleStr:(NSString *)string
{
    self.subLabel.text = string;
    [self setNeedsUpdateConstraints];
}

- (void)setSubTitleAttriStr:(NSAttributedString *)attriStr
{
    self.subLabel.attributedText = attriStr;
    [self setNeedsUpdateConstraints];
}

- (void)setImg:(UIImage *)image
{
    self.imageView.image = image;
    [self setNeedsUpdateConstraints];
}

- (void)setBtnStr:(NSString *)BtnStr
{
    [self.button setTitle:BtnStr forState:UIControlStateNormal];
    [self setNeedsUpdateConstraints];
}

- (void)setContentViewBackgroundColor:(UIColor *)backgroundColor
{
    self.containerView.backgroundColor = backgroundColor;
}

@end
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容