第四十一篇、Masonry利用Block实现链式编程

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

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

使用实例:

 UIButton * btn = [UIButton button].normalTitle(@"普通状态").normalImage([UIImage imageNamed:@"icon_help"]).selectedTitle(@"选中状态");
/// 声明文件
@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;
    };
}
时间: 2024-10-12 18:23:19

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

iOS 利用Block实现链式编程

1. 传统编程 // Person的方法 - (void)eat { NSLog(@"吃饭"); } - (void)learn { NSLog(@"学习"); } - (void)play { NSLog(@"娱乐"); } // 连续做事情 Person *p = [ [Person alloc] init ]; [p eat]; [p learn]; [p play]; 2. 不用Block,实现链式编程 // Person的方法 - (P

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

有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up.down.left.right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写: [ball right]; [ball down]; 如果能够按照下面这样写,会更加方便. [[ball right] down]; 要实现这样的功能十分简单,只要每个方法都返回self即可,但是如果调用次数多,会有很多个中括号.如果能改造成后面这样,会更好. ball.right().down

猫猫学iOS 之BLOCK的妙用_利用block实现链式编程

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:场景 我们有个对象人,他有两个方法,一个是学习study,一个是跑步run, 这个人有个怪癖,跑完步之后必须学习,为了实现这个方法并且能调用方便,我们让跑步和学习都回返回自己这个对象作为下一次调用的快捷方式,代码如下: 调用: int main(int argc, const char * argv[]) { @autoreleasepool { //初始化

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

前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的是外围的知识,有的是包含在框架内的. MVC学前篇字样?有噱头的成分也有真实的成分,所以工欲善其事,必先利其器.器是什么?基础嘛,虽然说MVC框架中涉及到的知识很多很多也不是我一篇两篇能说完的,我能做的就是知道多少就跟大家分享多少,当然了随着时间的推移会完善这个系列. 1扩展方法 扩展方法是C# 3.0特性里的知识,它用在最多的地方是在Linq中,

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

Person.h #import <Foundation/Foundation.h> @interface Person : NSObject - (Person *(^)())study; - (Person *(^)())run; @end Person.m #import "Person.h" @implementation Person - (Person *(^)())study { return ^{ NSLog(@"study"); ret

Block实现链式编程

1.Person.h文件 #import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject@property (copy, nonatomic) NSString *name;@property (assign, nonatomic) float weight;@property (strong, nonatomic) Dog *dog;- (Person *(^)(void))run;- (Person *(^)

iOS开发技巧系列---使用链式编程和Block来实现UIAlertView

UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本文也并不提倡开发者再使用UIAlertView,本文的目的是探讨如何将原来的给变量赋值和通过Delete来回调的方式变成链式编程风格和通过Block来回调.通过学习对UIAlertView的改造让各位iOS开发者能够学会这种更加便捷的开发方式 什么是链式编程 对于有一定开发经验的开发者来说,链式编程

iOS:用Block写一个链式编程

一.介绍 链式编程是一个比较新颖的编程方式,简单直观,用起来也比较舒服.目前比较有名的Mansory和BabyBlueTooth就是使用链式编程写的第三方框架. 二.写法 链式编程写法不同于传统方式,初次写起来比较别扭,但是一旦习惯了,用起来比较得心应手.那么,如何写呢?其实就是一个对象调用它的实例方法后返回一个block(已经定义过),而这个block内部又返回该对象.依此类推,该对象不论调用多少个它的实例方法,最终都会返回该对象本身. 三.实例 LearnManager类定义和实现 // /

ReactiveCocoa链式编程初探

在使用 masonry 框架实现自动布局时,在程序里为一个布局穿插着6行左右这样的代码 [View mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(anotherView); make.left.equalTo(anotherView); make.width.mas_equalTo(@60); make.height.mas_equalTo(@60); }]; 一直觉得不够漂亮,希望有个一行代码设置约束的框架