一直都觉得使用Masonry的时候语法特别优雅,很早的时候就想尝试下怎么实现,

一直都没弄明白,直到最近看见一篇叫block实现链式编程

1.方法的返回类型是代码块

  >代码块的返回类型是该类的实例变量

  >在返回的代码块中,设置完相关的操作,并把实例对象返回

使用实例:

 UIButton * btn = [UIButton button].normalTitle(@"普通状态").normalImage([UIImage imageNamed:@"icon_help"]).selectedTitle(@"选中状态");

给系统的UIkit框架中的UIButton拓展分类

/// 声明文件
@interface UIButton (JQExtension)
/// 连接符,没啥实际意义,蛋疼的时候可以无限.set....
- (instancetype)set; + (instancetype)button;
/// 设置普通状态标题
- (UIButton *(^)(NSString *))normalTitle; /// 设置选中状态标题
- (UIButton *(^)(NSString *))selectedTitle; /// 设置高亮状态标题
- (UIButton *(^)(NSString *))highlightTitle; /// 设置普通状态图片
- (UIButton *(^)(UIImage *))normalImage; /// 设置选中状态图片
- (UIButton *(^)(UIImage *))selectedImage; /// 设置高亮状态图片
- (UIButton *(^)(UIImage *))highlightedImage; /// 设置普通状态背景图片
- (UIButton *(^)(UIImage *))normalBackgroundImage; /// 设置高亮状态背景图片
- (UIButton *(^)(UIImage *))highlightedBackgroundImage; /// 设置选中状态背景图片
- (UIButton *(^)(UIImage *))selectedBackgroundImage; @end 实现文件
#import "UIButton+GKExtension.h" @implementation UIButton (GKExtension)
- (instancetype)set {
return self;
} + (instancetype)button {
return [self buttonWithType:UIButtonTypeCustom];
} - (UIButton *(^)(NSString *))normalTitle {
return ^(NSString *title){
[self setTitle:title forState:UIControlStateNormal];
return self;
};
} - (UIButton *(^)(NSString *))selectedTitle {
return ^(NSString *title){
[self setTitle:title forState:UIControlStateNormal];
return self;
};
} - (UIButton *(^)(NSString *))highlightTitle {
return ^(NSString *title){
[self setTitle:title forState:UIControlStateNormal];
return self;
};
} - (UIButton *(^)(UIImage *))normalImage {
return ^(UIImage *image){
[self setImage:image forState:UIControlStateNormal];
return self;
};
}
- (UIButton *(^)(UIImage *))normalBackgroundImage {
return ^(UIImage *image){
[self setBackgroundImage:image forState:UIControlStateNormal];
return self;
};
}
- (UIButton *(^)(UIImage *))selectedImage {
return ^(UIImage *image){
[self setImage:image forState:UIControlStateSelected];
return self;
};
} - (UIButton *(^)(UIImage *))selectedBackgroundImage {
return ^(UIImage *image){
[self setBackgroundImage:image forState:UIControlStateSelected];
return self;
};
} - (UIButton *(^)(UIImage *))highlightedImage {
return ^(UIImage *image){
[self setImage:image forState:UIControlStateHighlighted];
return self;
};
} - (UIButton *(^)(UIImage *))highlightedBackgroundImage {
return ^(UIImage *image){
[self setBackgroundImage:image forState:UIControlStateHighlighted];
return self;
};
}

第四十一篇、Masonry利用Block实现链式编程的更多相关文章

  1. iOS利用block实现链式编程方法(Objective-C链式编程)

    objc利用block实现链式编程方法 因为不好读.block和其他语言的匿名函数一样,很多程序员刚开始很难主动去用他. 本文描述block作为属性的实际使用,看懂block,并讲解如何利用block ...

  2. (一一八)利用block实现链式编程

    有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up.down.left.right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写 ...

  3. AJ学IOS 之BLOCK的妙用_利用block实现链式编程

    AJ分享,必须精品 一:场景 我们有个对象人,他有两个方法,一个是学习study,一个是跑步run, 这个人有个怪癖,跑完步之后必须学习,为了实现这个方法并且能调用方便,我们让跑步和学习都回返回自己这 ...

  4. ASP.NET MVC学前篇之扩展方法、链式编程

    ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...

  5. [Objective-C]用Block实现链式编程

    看这篇博客时最快让你上手ReactiveCocoa之基础篇看到作者介绍链式编程那一块,发现自己的钻研精神不足.想想自己使用链式编程也有段时间了,对,就是 Masonry 库.自己一直享受点语法带来的效 ...

  6. 新浪微博客户端(63)-使用block进行链式编程

    Person.h #import <Foundation/Foundation.h> @interface Person : NSObject - (Person *(^)())study ...

  7. ios的链式编程笔记

    1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数  > 链式编程思想 2. 使用block当函数的返回参数 // 之前开发中比较习惯 ...

  8. 模仿Masonry链式编程思想

    使用masonry 也将近一年多了,它的链式编程方式一直是很吸引我的. 之前一直没空好好思考它是如何实现,直到现在正好自己有空,因此写下链式编程的基本思路. 链式基本的编程形式如 a.property ...

  9. iOS 链式编程探索(Masonry)

    看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...

随机推荐

  1. ADO.NET 快速入门(十五):ADO 应用转换为 ADO.NET

    这是一个已经移植到 .NET 的 ADO 应用的例子.也演示了单向.只读.快速 DataReader 的使用.它演示如何使用 DataView 类从 DataSet 获取一个 Table 和 操作一个 ...

  2. 【转】windows上安装gvim

      gvim安装包下载:   简明安装说明:1.安装 gvim 安装包中的程序.2.安装 第三方软件安装包中的程序,将 dll 文件放入 system32目录.3.将 bin 目录加入 PATH 环境 ...

  3. c#加密 可逆与不可逆MD5 加密

    1.方法一 (不可逆加密) srxljl public string EncryptPassword(string PasswordString,string PasswordFormat )     ...

  4. ios开发——实用技术OC篇》倒计时实现的两种方法

    倒计时实现的两种方法 timeFireMethod函数,timeFireMethod进行倒计时的一些操作,完成时把timer给invalidate掉就ok了,代码如下: secondsCountDow ...

  5. Java基础:Collection—List&Set

    List和Set: List可以将元素维护在特定的序列中.它的特点是有序,允许重复元素出现.最常见的List的实现类是:ArrayList. Set的特点是:无序,不保存重复元素.当尝试将重复的元素添 ...

  6. C++中的inline函数

    内联函数: () 内联函数定义和作用: 将一个函数声明为inline,那么函数就成为内联函数.内联函数通常就是它在程序中每个调用点上“内联地”展开.从定义上看,内联函数跟一般函数不一样,一般函数调用的 ...

  7. 空间的配置和释放 std::alloc

    看完了对象的构造行为和内存释放前的对象的析构行为,我们现在来看看内存的配置和释放. 对象构造前的空间分配和析构后的空间释放,定义在头文件<stl_alloc.h>中.其设计思想是: 向sy ...

  8. NopCommerce 数据库初始化

    NopCommerce数据库初始化比较复杂,我简化了,只初始化创建一张表,不多说,直接上代码: //数据实体 /// <summary> /// Represents an affilia ...

  9. Java_Spring MVC_Servlet

    Spring MVC 例子 http://www.cnblogs.com/liukemng/p/3724379.html 详解: http://jinnianshilongnian.iteye.com ...

  10. nandsim ubi nand nor

    nandsim模拟mtd测试UBI模块 利用nandsim挂载ubi文件系统 MTD设备及JFFS2, UBIFS文件系统的使用简介 首先需要安装mtd_utils工具: sudo apt-get i ...