美文网首页
iOS-简单两步搞定自定义View

iOS-简单两步搞定自定义View

作者: 晴天ccc | 来源:发表于2019-12-04 11:46 被阅读0次

    目录

    • 前言
    • 【一】纯代码自定义View
      ---- 基本用法
      ---- 使用构造方法传入外部数据
    • 【二】XIB自定义View
      ---- 基本用法
      ---- 模拟简单弹框VIew使用案例

    前言

    相信大家对于自定义View并不陌生,很多业务上面都会遇到,今天做了个总结,三步骤搞定自定义VIew,分类纯代码和Xib布局的方式。

    【一】纯代码自定义View

    基本用法

    • 新建OC文件MyCodeCustomView.hMyCodeCustomView.m
    • initWithFrame:方法中将子控件添加到View中。
    • layoutSubviews设置内部控件的frame
    • 添加相关逻辑方法,在控制器中进行调用。

    MyCodeCustomView.h中:

    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface MyCodeCustomView : UIView
    
    // 显示View
    - (void)showPopView;
    
    // 隐藏View
    - (void)dismissPopView;
    
    // Block点击事件回调处理
    @property (copy,nonatomic) void (^submitBtnClickBlock)(UIView * view, NSString * keyStr);
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    MyCodeCustomView.m中:

    #import "MyCodeCustomView.h"
    
    @interface MyCodeCustomView ()
    @property (nonatomic, weak) UILabel *nameLab;
    @property (nonatomic, weak) UIImageView *headImgVIew;
    @property (nonatomic, weak) UIButton *submitBtn;
    @end
    
    @implementation MyCodeCustomView
    
    #pragma mark - 原始初始化方法
    
    // 1、首先调用init方法
    - (instancetype)init{
        if (self = [super init]) {
            [self setUp];
        }
        return self;
    }
      
    // 2、然后调用initWithFrame方法
    - (instancetype)initWithFrame:(CGRect)frame{
        if (self =[super initWithFrame:frame]) {
            [self setUp];
        }
        return self;
    }
    
    #pragma mark - UI布局
    
    // 初始化UI控件
    - (void)setUp{
     
        UILabel *nameLab = [[UILabel alloc] init];
        nameLab.backgroundColor = [UIColor yellowColor];
        nameLab.textAlignment = NSTextAlignmentCenter;
        [self addSubview:nameLab];
        _nameLab = nameLab;
        
        UIImageView *headImgVIew = [[UIImageView alloc] init];
        headImgVIew.backgroundColor = [UIColor redColor];
        [self addSubview:headImgVIew];
        _headImgVIew = headImgVIew;
        
        UIButton *submitBtn = [[UIButton alloc] init];
        submitBtn.backgroundColor = [UIColor blueColor];
        [submitBtn addTarget:self action:@selector(submitAction) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:submitBtn];
        _submitBtn = submitBtn;
     
    }
    
    // 设置UI控件的frame
    - (void)layoutSubviews{
        [super layoutSubviews];
        // 1.获取当前控件的尺寸
        CGFloat width = self.frame.size.width;
        CGFloat height = self.frame.size.height;
        // 2.设置子控件的frame
        self.nameLab.frame = CGRectMake(0, 0, width, 50);
        self.headImgVIew.frame = CGRectMake(0, 50, 100, 100);
        self.submitBtn.frame = CGRectMake(0, 150, width, height-450);
    }
    
    // 点击事件处理
    - (void)submitAction {
        // 根据自己业务处理TODO
        NSLog(@"hello world !");
        [self dismissPopView]; 
        // Block点击事件回调处理
        if (self.submitBtnClickBlock) {
            self.submitBtnClickBlock(self, @"hello world");
        }
    }
    
    #pragma mark - 视图显示/隐藏控制
    
    // 显示View
    - (void)showPopView{
        [[[UIApplication sharedApplication] windows].firstObject addSubview:self];
    }
    
    // 隐藏View
    - (void)dismissPopView{
        [self removeFromSuperview];
    }
    
    @end
    

    MainViewCtl.h中:

    #import "MainViewCtl.h"
    #import "MyCodeCustomView.h"
    
    @interface MainViewCtl ()
    @property (strong,nonatomic) MyCodeCustomView * codeCustomView;
    @end
    
    @implementation MainViewCtl
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 在合适的时候先显示View
        [self.codeCustomView showPopView];
        // 在合适的时候先隐藏View
        [self.codeCustomView dismissPopView];
        
    }
    
    #pragma mark - 懒加载
     
    - (MyCodeCustomView *)codeCustomView{
        if (!_codeCustomView) {
            _codeCustomView =  [[MyCodeCustomView alloc] initWithFrame:CGRectMake(0, 0, 300, 500)];
            _codeCustomView.frame =  CGRectMake(0, 0, 300, 500);
            // View点击方法回调处理
            _codeCustomView.submitBtnClickBlock = ^(UIView * _Nonnull view, NSString * _Nonnull keyStr) {
                // TODO
            };
        }
        return _codeCustomView;
    }
    @end
    

    使用构造方法传入外部数据

    MyCodeCustomView.h中增加:

    // 构造方法 
    - (instancetype)initWithData:(NSDictionary *)dataDict;
    
    // 外部数据
    @property (nonatomic,strong) NSDictionary *dataDict;
    

    MyCodeCustomView.m中增加:

    #pragma mark - 自定义初始化方法
    
    // 对象方法
    - (instancetype)initWithData:(NSDictionary *)dataDict{
        if (self = [super init]) {
            // 注意:先创建后赋值
            [self setUp];
            self.dataDict = dataDict;
        }
        return self;
    }
    
    #pragma mark - 数据相关
    
    // 数据Setter方法,外部传入数据就会调用该方法
    - (void)setDataDict:(NSDictionary *)dataDict{
        _dataDict = dataDict;
        self.nameLab.text = dataDict[@"realName"];
    }
    

    MyCodeCustomView.h中:

     
    @implementation MainViewCtl
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 在合适的时候先显示View
        [self.codeCustomView showPopView];
        // 在合适的时候先隐藏View
        [self.codeCustomView dismissPopView];
        // 在合适的时候调整数据
        self.codeCustomView.dataDict = @{@"realName":@"李四"}; 
    }
    
    #pragma mark - 懒加载
     
    - (MyCodeCustomView *)codeCustomView{
        if (!_codeCustomView) {
            _codeCustomView =  [[MyCodeCustomView alloc] initWithData:@{@"realName":@"张三"}];
            _codeCustomView.frame =  CGRectMake(0, 0, 300, 500);
            // View点击方法回调处理
            _codeCustomView.submitBtnClickBlock = ^(UIView * _Nonnull view, NSString * _Nonnull keyStr) {
                // TODO
            };
        }
        return _codeCustomView;
    }  
    @end
    

    【二】XIB自定义View

    基本用法

    • 新建OC文件MyCustomView.hMyCustomView.m,新建XIB文件MyCustomView.xib
    • 在XIB文件中进行UI布局。
    • 在Xib的Class中设置类名。
    • 在XIB中我们添加控件,进行布局约束了,所以只需要关注 awakeFromNib方法即可。
    • 使用XIB方式,在初始化的时候我们需要返回给到XIB对象。

    用法一:

    我们需要在自定义View中做操作,需要实例化对象,然后进行逻辑操作。

    MyCustomView.h中:

    @interface MyCustomView : UIView
    
    // XIB初始化方法
    + (instancetype)initWithCustomView;
    
    // 显示View
    - (void)showPopView;
    
    // 隐藏View
    - (void)dismissPopView;
    
    // Block点击事件回调处理
    @property (copy,nonatomic) void (^submitBtnClickBlock)(UIView * view, NSString * keyStr);
    
    @end
    

    MyCustomView.m中:

    #import "MyCustomView.h"
    
    @interface MyCustomView ()
    @property (weak, nonatomic) IBOutlet UIView * infoView;
    @property (weak, nonatomic) IBOutlet UIButton *checkBtn;
    @property (weak, nonatomic) IBOutlet UIButton *submitBtn;
    @property (copy, nonatomic) NSString *keyStr;
    @end
    
    @implementation MyCustomView
    
    #pragma mark - 初始化
    
    // XIB初始化方法
    + (instancetype)initWithCustomView{
        return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil] lastObject];
    }
    
    // Xib初始化完毕第一个调用的方法
    - (void)awakeFromNib{
        [super awakeFromNib];
        [self initBaseConfig];
    }
    
    // 在这里写初始化的一些功能和设置
    - (void)initBaseConfig {
        
    }
    
    #pragma mark - 视图显示/隐藏控制
    
    // 显示View
    - (void)showPopView{ 
        [[[UIApplication sharedApplication] windows].firstObject addSubview:self];
    }
    
    // 隐藏View
    - (void)dismissPopView{
        [self removeFromSuperview];
    }
    
    #pragma mark - 点击事件处理
    
    - (IBAction)btnClickAction:(UIButton *)sender {
       
       if (sender == self.checkBtn) {
           
       }else if (sender == self.submitBtn) {
           // Block点击事件回调处理
           if (self.submitBtnClickBlock) {
               self.submitBtnClickBlock(self, @"hello world");
           }
       }
      
    }
    @end
    

    在控制器MainViewCtl.m中:

    #import "MainViewCtl.h"
    #import "MyCustomView.h"
    
    @interface MainViewCtl ()
    @property (strong,nonatomic) MyCustomView * customView;
    @end
    
    @implementation MainViewCtl
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 在合适的时候先显示View
        [self.customView showPopView];
        // 在合适的时候先隐藏View
        [self.customView dismissPopView];
    }
    
    #pragma mark - 懒加载
    
    - (MyCustomView *)customView{
        if (!_customView) {
            _customView = [MyCustomView initWithCustomView];
            _customView.frame =  CGRectMake(0, 0, 300, 500);
            // View点击方法回调处理
            _customView.submitBtnClickBlock = ^(UIView * _Nonnull view, NSString * _Nonnull keyStr) {
                // TODO
            };
        }
        return _customView;
    }
    @end
    

    模拟简单弹框VIew使用案例

    例如一个弹框功能,我们无需再控制器进行操作,逻辑全部在View中处理。
    使用类方法进行初始化即可。

    MyCustomView.h中:

     
    @interface MyCustomView : UIView
    
    // XIB初始化方法
    + (instancetype)initWithCustomView;
    
    // 带参数的类构造方法
    + (void)initWithCustomViewWithKey:(NSString *)keyStr;
    
    // 显示View
    - (void)showPopView;
    
    // 隐藏View
    - (void)dismissPopView;
    
    // Block点击事件回调处理
    @property (copy,nonatomic) void (^submitBtnClickBlock)(UIView * view, NSString * keyStr);
    
    @end
    

    MyCustomView.m中:

    #import "MyCustomView.h"
    
    @interface MyCustomView ()
    @property (weak, nonatomic) IBOutlet UIView * infoView;
    @property (weak, nonatomic) IBOutlet UIButton *checkBtn;
    @property (weak, nonatomic) IBOutlet UIButton *submitBtn;
    @property (copy, nonatomic) NSString *keyStr;
    @end
    
    @implementation MyCustomView
    
    #pragma mark - 初始化
    
    // XIB初始化方法
    + (instancetype)initWithCustomView{
        return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil] lastObject];
    }
    
    // 带参数的构造方法
    + (void)initWithCustomViewWithKey:(NSString *)keyStr{
        MyCustomView *customView = [MyCustomView initWithCustomView];
        customView.keyStr = keyStr;
    }
    
    // Xib初始化完毕第一个调用的方法
    - (void)awakeFromNib{
        [super awakeFromNib];
        [self initBaseConfig];
    }
    
    // 在这里写初始化的一些功能和设置
    - (void)initBaseConfig {
        // 直接展示View
        self.frame = CGRectMake(0, 0, 300, 300);
        [self showPopView];
        if ([_keyStr isEqualToString:@"YES"]) {
            // TODO
        }
    }
    
    #pragma mark - 视图显示/隐藏控制
    
    // 显示View
    - (void)showPopView{ 
        [[[UIApplication sharedApplication] windows].firstObject addSubview:self];
    }
    
    // 隐藏View
    - (void)dismissPopView{
        [self removeFromSuperview];
    }
    
    #pragma mark - 点击事件处理
    
    - (IBAction)btnClickAction:(UIButton *)sender {
       // 只在CustomView里面完成逻辑处理,和外界不做交互
        [self dismissPopView];
       if (sender == self.checkBtn) {
           self.checkBtn.selected = !self.checkBtn.isSelected;
       }else if (sender == self.submitBtn) {
           [NSUserDefaults setValue:@"hello world" forKey:@"MYKEY"];
       }
    }
    
    @end
    
    

    在控制器MainViewCtl.m中:

    #import "MainViewCtl.h"
    #import "MyCustomView.h"
    
    @interface MainViewCtl ()
    @end
    
    @implementation MainViewCtl
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 仅做展示,逻辑操作在内部进行
        [MyCustomView initWithCustomViewWithKey:@"YES"];
    }
    @end
    

    相关文章

      网友评论

          本文标题:iOS-简单两步搞定自定义View

          本文链接:https://www.haomeiwen.com/subject/wqnkgctx.html