iOS 开发探索-链式编程实战

"天下武功,无快不破",求上天眷顾,愿各位技术大神来打通我的任督二脉,从此启动开挂模式,在技术进阶之路上狂奔.

最近项目开发中用到了Masonry框架
Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局 ,简洁明了,并具有高可读性,而且同时支持 iOS 和 Max OS X。

我们先来看一段官方的sample code来认识一下Masonry

[view mas_makeConstraints:^(MASConstraintMaker *make) {
   make.edges.equalTo(superview).with.insets(padding);
}];

相信各位大神早就熟知Masonry 这个开源框架,它主要采用链式编程思想.

链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)
链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

让我们来思考以下代码示例:

UIView *redView = [UIView new];
redView.X(100).Y(20).Width(50).Height(100);
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];    

UIView *blueView = [UIView new];
blueView.Center(CGPointMake(150, 300)).Size(CGSizeMake(100, 50));
blueView.backgroundColor = [UIColor blueColor];
[self.view addSubview:blueView];

大家有没有对以上代码布局感到奇怪,和我们通常的 frame 布局有所出入,请继续向下浏览

按照链式编程思想,本人对 UIVIew+Frame 这个布局分类做了简单扩展.
源码下载

UIView+Frame.h 头文件

#import <UIKit/UIKit.h>

@interface UIView (Frame)

- (UIView* (^)(CGFloat))X;

- (UIView* (^)(CGFloat))Y;

- (UIView* (^)(CGFloat))Width;

- (UIView* (^)(CGFloat))Height;

- (UIView* (^)(CGFloat))CenterX;

- (UIView* (^)(CGFloat))CenterY;

- (UIView* (^)(CGSize))Size;

@end

UIView+Frame.m

#import "UIView+Frame.h"

@implementation UIView (Frame)

- (UIView* (^)(CGFloat))X
{
    return ^UIView*(CGFloat x){
        CGRect frame = self.frame;
        frame.origin.x = x;
        self.frame = frame;
        return self;
    };
}


- (UIView* (^)(CGFloat))Y
{
    return ^UIView*(CGFloat y){
       CGRect frame = self.frame;
       frame.origin.y = y;
       self.frame = frame;
       return self;
    };
}


- (UIView* (^)(CGFloat))Width
{
    return ^UIView*(CGFloat width){
        CGRect frame = self.frame;
        frame.size.width = width;
        self.frame = frame;
        return self;
    };
}

- (UIView* (^)(CGFloat))Height
{
    return ^UIView*(CGFloat height){
       CGRect frame = self.frame;
       frame.size.height = height;
       self.frame = frame;
       return self;
    };
}


- (UIView* (^)(CGFloat))CenterX
{
    return ^UIView*(CGFloat centerX){
        CGRect frame = self.frame;
        frame.origin.x = centerX;
        self.frame = frame;
        return self;
    };
}

- (UIView* (^)(CGFloat))CenterY
{
    return ^UIView*(CGFloat centerY){
        CGRect frame = self.frame;
        frame.origin.y = centerY;
        self.frame = frame;
        return self;
    };
}

- (UIView* (^)(CGSize))Size
{
    return ^UIView*(CGSize size){
       CGRect frame = self.frame;
        frame.size = size;
        self.frame = frame;
        return self;
    };
}


- (void)setX:(CGFloat)x
{
    CGRect frame = self.frame;
    frame.origin.x = x;
    self.frame = frame;
}

- (CGFloat)x
{
    return self.frame.origin.x;
}

- (void)setY:(CGFloat)y
{
    CGRect frame = self.frame;
    frame.origin.y = y;
    self.frame = frame;
}

- (CGFloat)y
{
    return self.frame.origin.y;
}

- (void)setWidth:(CGFloat)width
{
    CGRect frame = self.frame;
    frame.size.width = width;
    self.frame = frame;
}

- (CGFloat)width
{
    return self.frame.size.width;
}

- (void)setHeight:(CGFloat)height
{
    CGRect frame = self.frame;
    frame.size.height = height;
    self.frame = frame;
}

- (CGFloat)height
{
    return self.frame.size.height;
}

- (CGSize)size{
    return self.frame.size;
}

- (void)setSize:(CGSize)size{
    CGRect frame = self.frame;
    frame.size = size;
    self.frame = frame;
}

- (CGFloat)centerX{
    return self.frame.origin.x;  
}

- (void)setCenterX:(CGFloat)centerX{
    CGRect frame = self.frame;
    frame.origin.x = centerX;
    self.frame = frame;
}

- (CGFloat)centerY{
    return self.frame.origin.y;
}

- (void)setCenterY:(CGFloat)centerY{
    CGRect frame = self.frame;
    frame.origin.y = centerY;
    self.frame = frame;
}
@end

笔者做为一名屌丝程序员,每天都在技术路上前行,由于本人天生愚钝,学艺不精,在此献丑啦!

项目地址:https://github.com/524429264/LSBC-Demo.git

扫描下方二维码关注我###

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

推荐阅读更多精彩内容