iOS 開(kāi)發(fā)探索-鏈?zhǔn)骄幊虒?shí)戰(zhàn)

"天下武功,無(wú)快不破",求上天眷顧,愿各位技術(shù)大神來(lái)打通我的任督二脈,從此啟動(dòng)開(kāi)掛模式,在技術(shù)進(jìn)階之路上狂奔.

最近項(xiàng)目開(kāi)發(fā)中用到了Masonry框架
Masonry是一個(gè)輕量級(jí)的布局框架,擁有自己的描述語(yǔ)法,采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝自動(dòng)布局 ,簡(jiǎn)潔明了,并具有高可讀性,而且同時(shí)支持 iOS 和 Max OS X。

我們先來(lái)看一段官方的sample code來(lái)認(rèn)識(shí)一下Masonry

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

相信各位大神早就熟知Masonry 這個(gè)開(kāi)源框架,它主要采用鏈?zhǔn)骄幊趟枷?

鏈?zhǔn)骄幊趟枷耄菏菍⒍鄠€(gè)操作(多行代碼)通過(guò)點(diǎn)號(hào)(.)鏈接在一起成為一句代碼,使代碼可讀性好。a(1).b(2).c(3)
鏈?zhǔn)骄幊烫攸c(diǎn):方法的返回值是block,block必須有返回值(本身對(duì)象),block參數(shù)(需要操作的值)

讓我們來(lái)思考以下代碼示例:

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];

大家有沒(méi)有對(duì)以上代碼布局感到奇怪,和我們通常的 frame 布局有所出入,請(qǐng)繼續(xù)向下瀏覽

按照鏈?zhǔn)骄幊趟枷?本人對(duì) UIVIew+Frame 這個(gè)布局分類做了簡(jiǎn)單擴(kuò)展.
源碼下載

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

筆者做為一名屌絲程序員,每天都在技術(shù)路上前行,由于本人天生愚鈍,學(xué)藝不精,在此獻(xiàn)丑啦!

項(xiàng)目地址:https://github.com/524429264/LSBC-Demo.git

掃描下方二維碼關(guān)注我###

零距離仰望星空
在此感謝各位讀者的來(lái)訪,您的關(guān)注是我寫作分享的最大動(dòng)力。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容