iOS开发中使用链式编程创建UIButton

具体的代码参见 https://github.com/yanjie311/Chain-coding---primary

链式编程

对于有一定开发经验的人来说链式编程并不陌生,有很多知名的开源库都是采用的这种编程方式,在iOS库中,Masory和Snapkit也是典型的使用链式编程的例子。
大体来说,链式编程就是将多个操作(多行代码)通过某种操作符(通常是点号.)链接成一句的代码.便代码更加紧凑,可读性也更好,降低了代码的重复度.比如以下代码:

//普通方法实现
    [sender setImage:[UIImage imageNamed:@"newcreate_click.png"] forState:UIControlStateNormal];
    sender.imageView.contentMode = UIViewContentModeScaleAspectFit;
    [sender setTitle:@"你好" forState:UIControlStateNormal];
    [sender setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
    sender.titleLabel.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:sender];
    //链式结构实现
    sender1.ImagePrams(@"newcreate_click.png",1)
    .TitlePrams(@"你好", 17, [UIColor grayColor], 1)
    .ClickAction(sender1);
    [self.view addSubview:sender1];

通过这个例子读者应该可以更清楚的了解什么是链式编程风格.简单来说,链式编程风格要有以下特点:

  • 通常是都是调用一个函数来给属性赋值.也就是说,该函数封装了赋值的语句,还可以在里面加入自己的判断和一些逻辑.
  • 该函数必须有一个返回值,通常是它本身.也可以是处理后的数据或者对象.
  • 可以用静态函数作为起始函数,但是后面的全是实例函数.
  • 可以设定一个最终函数,该函数不返回任何对象,用它来完成最后所有操作.

链式编程的利弊

使用链式编程最主要的好处是可以使代码更简洁,写起来一种"爽快"感.设计优秀的链式编程可以大大降低重复的代码,增强逻辑感.不足之处就是对开
发者的业务逻辑能力要求较高,同时因为链式编程都是调用函数,所以有可能会造成过深的函数调用栈.稍微影响性能.

创建按钮

 WYJLinkerButton* sender1 = [WYJLinkerButton creatButton:CGRectMake(100, 100, 100, 100)];
    sender1.ImageEdgInsets(20,0,60,60)
    .TitleEdgInsets(0,63,100,23)
    .ImagePrams(@"newcreate_click.png",1)
    .TitlePrams(@"你好", 17, [UIColor grayColor], 1)
    .ClickAction(sender1);
    [self.view addSubview:sender1];

    WYJLinkerButton* sender2 = [WYJLinkerButton creatButton:CGRectMake(100, 200, 100, 100)];
    sender2.backgroundColor = [UIColor blueColor];    sender2.ImageEdgInsets(0,25,40,40).TitleEdgInsets(45,32,55,25).ImagePrams(@"newcreate_click.png",1).TitlePrams(@"不开心!",16,[UIColor redColor], 1).ClickAction(sender2);
    sender2.jmImagev.layer.cornerRadius = 10;
    sender2.jmImagev.layer.masksToBounds = YES;
    [self.view addSubview:sender2];

    WYJLinkerButton* sender3 = [WYJLinkerButton creatButton:CGRectMake(120, 300, 80, 30)];
    sender3.ImageEdgInsets(0,2.5,25,25)
    .TitleEdgInsets(27,2.5,55,25)
    .ImagePrams(@"newcreate_click.png",1)
    .TitlePrams(@"发微博",16,[UIColor blueColor], 1)
    .ClickAction(sender3);
    [self.view addSubview:sender3];

简单举例(给按钮添加label)

  • .h文件中的属性写法
** Title的参数值,“(title, fountSize, textColor)” */
@property(nonatomic,copy)
WYJLinkerButton* (^TitlePrams)(NSString* title,NSInteger fountSize,UIColor*textColor, NSTextAlignment textAlignment);
  • .m文件中的实现
- (WYJLinkerButton *(^)(NSString *, NSInteger, UIColor *, NSTextAlignment))TitlePrams {
    return ^WYJLinkerButton* (NSString* title,NSInteger fountSize,UIColor*textColor, NSTextAlignment textAlignment){
        self.jmLabel.text = title;
        self.jmLabel.textColor = textColor;
        self.jmLabel.font = [UIFont systemFontOfSize:fountSize];
        self.jmLabel.textAlignment = textAlignment;
        return self;
    };
}

github上有具体的代码参考,欢迎大家批评指正,谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,791评论 2 10
  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,721评论 2 7
  • iphone开发笔记 退回输入键盘 - (BOOL) textFieldShouldReturn:(id)text...
    爱易寒曲易散阅读 631评论 0 1
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,547评论 1 14
  • 我一路历山涉水去探寻江南,仿佛那是在追求一处世外桃源。 姑苏城到底是没有令我失望,我满怀着欣喜写下这一篇随笔。 也...
    离岸的船阅读 314评论 0 2