CNLiveErrorOrNoNetView.m 6.36 KB
//
//  CNLiveErrorOrNoNetView.m
//  CNLiveMyOrderModule
//
//  Created by 殷巧娟 on 2019/11/19.
//

#import "CNLiveErrorOrNoNetView.h"
#import <QMUIKit/QMUIKit.h>
#import <Masonry/Masonry.h>
#import <objc/runtime.h>
#import <CNLiveBaseKit/ColorMacro.h>
#import "CNLiveCommonCategory.h"
static const char retryKey;
@interface CNLiveErrorOrNoNetView ()

@property (nonatomic, strong) UIImageView *iconView;
@property (nonatomic, strong) UILabel *errorLab;
@property (nonatomic, strong) UILabel *tipLab;;
@property (nonatomic, strong) UIButton *retryBtn;
@end

@implementation CNLiveErrorOrNoNetView
- (void)dealloc
{
    NSLog(@"CNLiveErrorOrNoNetView dealloc");
}

- (instancetype)initWithView:(UIView *)view type:(RetryType)type
{
    self = [super initWithFrame:view.bounds];
    if (self) {
        self.backgroundColor = kWhiteColor;
        [self addSubview:self.iconView];
        [self addSubview:self.errorLab];
        [self addSubview:self.tipLab];
        [self addSubview:self.retryBtn];
        
        if (type == RetryTypeError) {
            self.errorLab.text = @"接口请求错误";
        } else {
            self.errorLab.text = @"无法连接网络";
        }
        
        [self p_addMasonry];
    }
    return self;
}

+ (CNLiveErrorOrNoNetView *)showErrorByType:(RetryType)type view:(UIView *)view hidenRetry:(BOOL)hidenRetry handle:(RetryHandle)handle {

    if (hidenRetry) {
        if (type == RetryTypeError) {
            [QMUITips showError:@"接口请求失败,请稍后再试!" inView:view hideAfterDelay:1.5];
        } else {
            [QMUITips showError:@"网络连接失败,请稍后再试!" inView:view hideAfterDelay:1.5];
        }
        return nil;
    }
    
    CNLiveErrorOrNoNetView *tipView = [self tipViewInView:view];
    if (!tipView) {
        tipView = [[CNLiveErrorOrNoNetView alloc] initWithView:view type:type];
        if (handle) {
            objc_setAssociatedObject (tipView , &retryKey, handle, OBJC_ASSOCIATION_COPY_NONATOMIC);
        }
        
        [view addSubview:tipView];
    }
        
    return tipView;

}

+ (instancetype)tipViewInView:(UIView *)view {
    
    NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator];
    for (UIView *subview in subviewsEnum) {
        if ([subview isKindOfClass:self]) {
            return (CNLiveErrorOrNoNetView *)subview;
        }
    }
    return nil;
    
}

+ (CNLiveErrorOrNoNetView *)showErrorByType:(RetryType)type view:(UIView *)view hidenRetry:(BOOL)hidenRetry handle:(RetryHandle)handle frame:(CGRect)frame {
    
    if (hidenRetry) {
        if (type == RetryTypeError) {
            [QMUITips showError:@"接口请求失败,请稍后再试!" inView:view hideAfterDelay:1.5];
        } else {
            [QMUITips showError:@"网络连接失败,请稍后再试!" inView:view hideAfterDelay:1.5];
        }
        return nil;
    }
    
    CNLiveErrorOrNoNetView *tipView = [self tipViewInView:view];
    if (!tipView) {
        tipView = [[CNLiveErrorOrNoNetView alloc] initWithView:view type:type frame:frame];
        if (handle) {
            objc_setAssociatedObject (tipView , &retryKey, handle, OBJC_ASSOCIATION_COPY_NONATOMIC);
        }
        
        [view addSubview:tipView];
    }
    
    return tipView;
}

- (instancetype)initWithView:(UIView *)view type:(RetryType)type frame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
        [self addSubview:self.iconView];
        [self addSubview:self.errorLab];
        [self addSubview:self.tipLab];
        [self addSubview:self.retryBtn];
        
        if (type == RetryTypeError) {
            self.errorLab.text = @"接口请求错误";
        } else {
            self.errorLab.text = @"无法连接网络";
        }
        
        [self p_addMasonry];
    }
    return self;
}

#pragma mark -
#pragma mark - Action
- (void)retryBtnAction {
    
    RetryHandle handle = objc_getAssociatedObject(self, &retryKey);
    if (handle) {
        handle();
    }
    [self removeFromSuperview];
    
}
- (void)p_addMasonry {
    
    [self.iconView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(80, 80));
        make.centerX.mas_equalTo(self.mas_centerX);
        make.centerY.mas_equalTo(self.mas_centerY).mas_offset(-79);
    }];
    [self.errorLab mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.mas_equalTo(self.mas_centerX);
        make.top.mas_equalTo(self.iconView.mas_bottom).mas_offset(15);
    }];
    [self.tipLab mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.mas_equalTo(self.mas_centerX);
        make.top.mas_equalTo(self.errorLab.mas_bottom).mas_offset(14);
    }];
    [self.retryBtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.mas_equalTo(self.mas_centerX);
        make.top.mas_equalTo(self.tipLab.mas_bottom).mas_offset(16);
        make.size.mas_equalTo(CGSizeMake(84.5, 28));
    }];
}

#pragma mark -
#pragma mark - Getter
- (UIImageView *)iconView
{
    if (!_iconView) {
        _iconView = [[UIImageView alloc] init];
        _iconView.image = [UIImage cnLive_getImageNameWithBundle:@"wufalianjie" bundle:@"CNLiveMyOrderModule.bundle/CNLiveMyOrderModule" targetClass:[self class]];
    }
    return _iconView;
}

- (UILabel *)errorLab
{
    if (!_errorLab) {
        _errorLab = [[UILabel alloc] init];
        _errorLab.textColor = KGray102Color;
        _errorLab.font = UIFontMake(17);
        _errorLab.textAlignment = NSTextAlignmentCenter;
    }
    return _errorLab;
}

- (UILabel *)tipLab
{
    if (!_tipLab) {
        _tipLab = [[UILabel alloc] init];
        _tipLab.text = @"别紧张,试试看刷新页面~";
        _tipLab.textColor = KGray153Color;
        _tipLab.font = UIFontMake(13);
        _tipLab.textAlignment = NSTextAlignmentCenter;
    }
    return _tipLab;
}

- (UIButton *)retryBtn
{
    if (!_retryBtn) {
        _retryBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        _retryBtn.backgroundColor = UIColorMake(0, 194, 0);
        [_retryBtn setTitle:@"重试" forState:UIControlStateNormal];
        [_retryBtn setTitleColor:kWhiteColor forState:UIControlStateNormal];
        _retryBtn.layer.cornerRadius = 6;
        _retryBtn.layer.masksToBounds = YES;
        [_retryBtn addTarget:self action:@selector(retryBtnAction) forControlEvents:UIControlEventTouchUpInside];
    }
    return _retryBtn;
}


@end