自定义view的基类

主要考虑以下几个问题

  • 从xib创建自定义view

  • 纯代码创建自定义view

  • 在故事版中使用

  • 纯代码方式创建

头文件

@interface XXXBaseView : UIView

#pragma mark - overridder
// 在init之后执行,初始化配置工作
- (void)setup;

@end

实现文件

#import "XXXBaseView.h"

@interface XXXBaseView ()
// 从xib中加载的view
@property (strong, nonatomic) UIView *xibView;

@end

@implementation XXXBaseView

#pragma mark - life cycle
// 从xib加载
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self setup];
    }
    return self;
}

// 代码创建
- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

// 布局,紧贴容器
- (void)layoutSubviews {
    [super layoutSubviews];
    // 让xib加载的view紧贴容器
    if (self.xibView) {
        [self.xibView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(0);
            make.bottom.mas_equalTo(0);
            make.left.mas_equalTo(0);
            make.right.mas_equalTo(0);
        }];
    }
}

#pragma mark - overridder
// 在init之后执行,初始化配置工作
- (void)setup {
    // 如果与同名的xib文件存在,就加载
    NSString *className = NSStringFromClass([self class]);
    NSString *filePath = [NSString stringWithFormat:@"%@/%@.nib",[[NSBundle mainBundle] resourcePath], className];
    BOOL isNibExist = [[NSFileManager defaultManager] fileExistsAtPath: filePath];
    if (isNibExist) {
        // 如果nib文件不存在,loadNibNamed会崩溃
        self.xibView = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil].firstObject;
        [self addSubview:self.xibView];
    }
}

@end

参考文章

iOS验证nib文件是否存在

你可能感兴趣的:(自定义view的基类)