iOS-Study自定义视图view封装弹框AlterView

前言:我们开发的时候经常会自定义一些view,以备后用,今天从简书上看到一篇用view封装弹框的文章,就拿来学习学习。封装一下,以备学习,感谢那位作者。

效果图:


自定义AlterView.gif

目录:
1.简单的思路
2.代码示例
3.使用方法
4.学习要点
5.思路总结
6.学习体会
7.Demo地址以及原作者地址

  • 简单的思路:
    1.创建一个继承于UIView的类
    2.设置类所需的子控件
    3.在创建一个类方法,供于外部调去,属性传值,以及block回调。
    利用block将点击事件传递到外部类中。
  • 代码示例:

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

  /**取消按钮点击事件*/
  typedef void (^cancelBlock)();
  /**确定按钮点击事件*/
  typedef void (^sureBlock)();
  @interface ZYAlterView : UIView
  /**失败回调*/
  @property(copy,nonatomic) cancelBlock cancel_block;
  /**成功回调*/
  @property(copy,nonatomic) sureBlock sure_block;
  /**
    *
    *  @param title           标题
    *  @param content         内容
    *  @param cancel          取消按钮内容
    *  @param sure            确定按钮内容
    *  @param cancelBlock   取消按钮点击事件
    *  @param sureBlock     确定按钮点击事件
    *
    *  @return ZYAlterView
    */
   +(instancetype)alterViewWithTitle:(NSString *)title
                             content:(NSString *)content
                              cancel:(NSString *)cancel
                                sure:(NSString *)sure
                  cancel_Block_Clcik:(cancelBlock)cancelBlock
                    sure_Block_Click:(sureBlock)sureBlock;
    @end

解析:

  • 首先,在.h文件,创建两个block的别名(成功和失败的回调),用于把按钮的点击事件传到外界,有良好的沟通。
  • 其次,创建一个类方法-要把你封装的AlterView,所需的属性,从外界传进来,在通过block进行回调。也就是,从外界传进来的属性,需要我们从外界调用此方法,并设置AlterView的属性值。

ZYAlterView.m
#import "ZYAlterView.h"

   #define KSCREEN_W  [UIScreen mainScreen].bounds.size.width
   #define KSCREEN_H   [UIScreen mainScreen].bounds.size.height
   @interface ZYAlterView ()
    /**标题lable*/
    @property(strong,nonatomic)UILabel *titleLab;
    /**内容lable*/
    @property(strong,nonatomic)UILabel *contentLab;
    /**取消Btn*/
    @property(strong,nonatomic)UIButton *cancelBtn;
    /**确定Btn*/
    @property(strong,nonatomic)UIButton *sureBtn;
    /**标题*/
    @property(copy,nonatomic)NSString *title;
    /**内容*/
    @property(copy,nonatomic)NSString *content;
    /**取消*/
    @property(copy,nonatomic)NSString *cancelTitle;
    /**确定*/
    @property(copy,nonatomic)NSString *sureTitle;
    @end
    @implementation ZYAlterView
    #pragma mark - 初始化(添加控件)
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self =  [super initWithFrame:frame];
        if (self) {
    >
    //   标题
    _titleLab = [[UILabel alloc]initWithFrame:(CGRect){0,0,self.bounds.size.width,50}];
    _titleLab.textAlignment = NSTextAlignmentCenter;
    _titleLab.textColor = [UIColor blackColor];
    [self addSubview:_titleLab];
    >
    //   内容
    _contentLab = [[UILabel alloc]initWithFrame:(CGRect){0,CGRectGetMaxY(_titleLab.frame),self.bounds.size.width,50}];
    _contentLab.textAlignment = NSTextAlignmentCenter;
    _contentLab.textColor = [UIColor redColor];
    [self addSubview:_contentLab];
    >
    //   取消按钮
    _cancelBtn = [[UIButton alloc]initWithFrame:(CGRect){0,CGRectGetMaxY(_contentLab.frame),self.bounds.size.width/2,50}];
    _cancelBtn.layer.borderColor = [UIColor grayColor].CGColor;
    _cancelBtn.layer.borderWidth = 0.5;
    [_cancelBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [_cancelBtn addTarget:self action:@selector(cancelBtClick) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:_cancelBtn];
    >
    //   确定按钮
    _sureBtn = [[UIButton alloc]initWithFrame:(CGRect){self.bounds.size.width/2,CGRectGetMaxY(_contentLab.frame),self.bounds.size.width/2,50}];
    _sureBtn.layer.borderColor = [UIColor grayColor].CGColor;
    _sureBtn.layer.borderWidth = 0.5;
    [_sureBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [_sureBtn addTarget:self action:@selector(sureBtClick) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:_sureBtn];
   }
     return self;
   }
  #pragma mark----实现类方法
  +(instancetype)alterViewWithTitle:(NSString *)title
                                      content:(NSString *)content
                                       cancel:(NSString *)cancel
                                          sure:(NSString *)sure
                  cancel_Block_Clcik:(cancelBlock)cancelBlock
                      sure_Block_Click:(sureBlock)sureBlock
    {
      ZYAlterView *alterView = [[ZYAlterView alloc]initWithFrame:(CGRect){0,0,250,150}];
      alterView.backgroundColor = [UIColor whiteColor];
      alterView.center = (CGPoint){KSCREEN_W/2,KSCREEN_H/2};
      alterView.layer.cornerRadius = 5;
      alterView.layer.masksToBounds = YES;
      alterView.title=title;
      alterView.content=content;
      alterView.cancelTitle=cancel;
      alterView.sureTitle=sure;
      alterView.cancel_block=cancelBlock;
      alterView.sure_block=sureBlock;
      return alterView;
      }
    #pragma mark--给属性重新赋值
    -(void)setTitle:(NSString *)title
    {
        _titleLab.text  = title;
    }
    -(void)setContent:(NSString *)content
   {
      _contentLab.text = content;
   }
    -(void)setSureTitle:(NSString *)sureTitle
  {
     [_sureBtn setTitle:sureTitle forState:UIControlStateNormal];
  }
  - (void)setCancelTitle:(NSString *)cancelTitle
  {
    [_cancelBtn setTitle:cancelTitle forState:UIControlStateNormal];
  }
  #pragma mark----取消按钮点击事件
  -(void)cancelBtClick
  {
      [self removeFromSuperview];
      self.cancel_block();
  }
  #pragma mark----确定按钮点击事件
  -(void)sureBtClick
  {
      [self removeFromSuperview];
      self.sure_block();
     }
  @end

解析:
通过init初始化控件,在通过自定义的类方法,创建自定义的类,对其属性进行赋值,但是,此时,控件没有值。其实,为其属性赋值,就是写其属性的set方法,通过set方法,给本类上的控件赋值。如上代码。

  • 使用方法:

在ViewController.m中 导入"#import "ZYAlterView.h""头文件调用代码:
ZYAlterView *alterView = [ZYAlterView alterViewWithTitle:@"自定义弹框学习" content:@"虚心学习,真爱生命!" cancel:@"取消" sure:@"确定" cancel_Block_Clcik:^{

    //取消按钮点击事件
  NSLog(@"取消");
   } sure_Block_Click:^{
    //确定按钮点击事件
    NSLog(@"确定");
   }];

ZYAlterView直接封装成了类方法,并且可以手动填写标题,内容,取消按钮的内容,确定按钮的内容,还有一个需要注意的就是笔者将取消按钮和确定按钮的点击事件利用block传递出来了,这点值得我们学习。

  • 学习要点:
    1.取消按钮和确定按钮的点击事件利用block传递出来
    2.set方法传值
    3.自定义UIView思想的学习
  • 思路总结:

因为笔者将该view封装成了类方法,所以会调用这个类时会先执行
+(instancetype)alterViewWithTitle:(NSString *)title...
方法,紧接着执行
-(instancetype)initWithFrame:(CGRect)frame
方法,然后会继续执行alterView.title=title;属性赋值的方法,但是这时界面展示不出来内容的,需要在set方法中重新给相关内容赋值才会展示出来,最后俩个函数就是利用block将点击事件传递到外部类中。

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

推荐阅读更多精彩内容