鏈?zhǔn)骄幊?/h4>
鏈?zhǔn)骄幊毯?jiǎn)單的說(shuō)就是將多個(gè)方法用點(diǎn)語(yǔ)法連接起來(lái)羹呵,讓代碼更加簡(jiǎn)潔壁晒,可讀性更強(qiáng)瓷们。例如Masonry
,SDAutoLayout
;
make.left.right.mas_equalTo(0);
這一行代碼秒咐,就同時(shí)實(shí)現(xiàn)了設(shè)置左右兩邊間距都為0谬晕;
Masonry怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用的
- 在
Masonry
中,.left .right .top .bottom
等方法携取,都是返回一個(gè)MASConstraintMaker
實(shí)例類(lèi)固蚤,里面有l(wèi)eft、right等屬性來(lái)保存每次調(diào)用的信息歹茶;
- (MASConstraintMaker *)left;
- 在
Masonry
中夕玩,offset(15)
等方法,可以接受一個(gè)參數(shù)惊豺,然后返回的還是MASConstraintMaker
實(shí)例類(lèi)燎孟,怎么接受參數(shù)呢?Masonry返回了一個(gè)block尸昧,這個(gè)block的返回值是MASConstraintMaker
揩页,并且可以接收一個(gè)參數(shù);
- (MASConstraint * (^)(CGFloat offset))offset;
- 在
Masonry
中烹俗,為了方便閱讀爆侣,還有一種方法萍程,什么都沒(méi)有處理直接返回MASConstraintMaker
實(shí)例類(lèi);
- (MASConstraintMaker *)with;
創(chuàng)建我們自己的鏈?zhǔn)秸{(diào)用
我覺(jué)的我們可以通過(guò)鏈?zhǔn)秸{(diào)用來(lái)設(shè)置view的一些屬性,例如Label兔仰,首先我們要想象一下我們最終實(shí)現(xiàn)好調(diào)用的樣子茫负,
[UILabel dcMaker_creat].frame(CGRectMake(100, 200, 100, 50))
.text(@"this is a label")
.textColor([UIColor redColor])
.font(15).fontWeight(UIFontWeightMedium)
.textAlignment(NSTextAlignmentLeft)
.numberOfLines(2)
.intoView(self.view);
這種方式更像SDAutoLayout
,我個(gè)人更喜歡這種風(fēng)格,因?yàn)槲矣X(jué)得沒(méi)必要像Masonry
那樣通過(guò)mas_makeConstraints:^(MASConstraintMaker *make) {}];
把MASConstraintMaker
拋出來(lái)乎赴,然后在block中設(shè)置屬性忍法。我覺(jué)的可以通過(guò)某個(gè)方法拿到一個(gè)maker,然后就可以不停的點(diǎn)語(yǔ)法設(shè)置屬性榕吼,個(gè)人覺(jué)得這樣用起來(lái)非常爽哈哈哈饿序;
先說(shuō)一下整體思路,首先我們需要一個(gè)類(lèi)似于
MASConstraintMaker
的中間類(lèi)羹蚣,這個(gè)類(lèi)可以一直調(diào)用點(diǎn)語(yǔ)法設(shè)置屬性原探,并且能保存設(shè)置的這些屬性,最后這個(gè)類(lèi)還需要一個(gè)方法來(lái)返回一個(gè)view
;接下來(lái)就是具體實(shí)現(xiàn)了顽素,首先我們創(chuàng)建一個(gè)類(lèi)
DCLabelMaker
咽弦,然后外面要通過(guò)這類(lèi)來(lái)設(shè)置屬性,外面怎么調(diào)用呢戈抄?肯定是這樣.font(15).text(@"label")
,怎么才能實(shí)現(xiàn)這樣的效果后专,模仿Masonry
我們添加一個(gè)類(lèi)型為block的屬性划鸽,這個(gè)block的返回值還是DCLabelMaker
;
@property (nonatomic,copy,readonly) DCLabelMaker* (^font)(CGFloat font);
這樣外面用的時(shí)候就是maker.font(15)
戚哎,這樣裸诽,因?yàn)榉祷氐氖?code>DCLabelMaker,所以還能接著調(diào)用點(diǎn)語(yǔ)法型凳;這樣就實(shí)現(xiàn)了連續(xù)通過(guò)點(diǎn)語(yǔ)法調(diào)用丈冬。
- 這里有一點(diǎn)需要注意,因?yàn)橥獠恐皇峭ㄟ^(guò)點(diǎn)語(yǔ)法來(lái)調(diào)用甘畅,點(diǎn)語(yǔ)法就是get方法埂蕊,外部是不能調(diào)用set方法來(lái)修改的,因此這里設(shè)置成
readonly
疏唾。Masonry
直接設(shè)置了一個(gè)方法
- (MASConstraint* (^)(CGFloat offset))offset;
為什么我們用屬性呢蓄氧?因?yàn)閷傩栽谡{(diào)用之后會(huì)有聯(lián)想提示,只要敲出.font
,會(huì)自動(dòng)補(bǔ)全后面需要傳的參數(shù)槐脏,這樣外部編寫(xiě)的時(shí)候會(huì)非常舒服喉童; - 最核心的難題被我們解決了,接下就看這個(gè)屬性的get方法怎么實(shí)現(xiàn)了顿天,其實(shí)很簡(jiǎn)單堂氯,只要把傳進(jìn)來(lái)的參數(shù)保存起來(lái)就可以了蔑担。這里我新創(chuàng)建了一個(gè)Model
DCViewAttribute
用來(lái)專(zhuān)門(mén)存儲(chǔ)設(shè)置的屬性;
-(DCLabelMaker * _Nonnull (^)(CGFloat))font{
__weak typeof(self) weak_self = self;
return ^DCLabelMaker* (CGFloat font){
weak_self.viewAttribute.font = font;
return weak_self;
};
}
- 屬性設(shè)置完之后咽白,我們就可以返回一個(gè)view了啤握,因?yàn)橐粋€(gè)view肯定是要添加到一個(gè)superView上的,因此我們?cè)O(shè)置一個(gè)方法
intoView(superView)
,這個(gè)block接受一個(gè)參數(shù)view局扶,把要?jiǎng)?chuàng)建的view添加到這個(gè)view上恨统,然后返回出來(lái);
.h文件添加屬性
@property (nonatomic,copy,readonly) UILabel* (^intoView)(UIView *superView);
.m文件實(shí)現(xiàn)方法
- (UILabel * _Nonnull (^)(UIView * _Nonnull))intoView{
__weak typeof(self) weak_self = self;
return ^UILabel * _Nonnull(UIView * _Nonnull superView) {
DCViewAttribute *viewAttribute = weak_self.viewAttribute;
UILabel *label = [[UILabel alloc]initWithFrame:viewAttribute.frame];
label.font = [UIFont systemFontOfSize:viewAttribute.font];
[superView addSubview:label];
return label;
};
}
- 這樣我們的maker就已經(jīng)完成了三妈,然后我們只需要給UILabel添加一個(gè)分類(lèi)方法畜埋,來(lái)創(chuàng)建一個(gè)maker就大功告成了;
.h
+ (DCLabelMaker *)dcMaker_creat;
.m
+(DCLabelMaker *)dcMaker_creat{
DCLabelMaker *maker = DCLabelMaker.new;
maker.viewAttribute = DCViewAttribute.new;
return maker;
}
大功告成3肫选S瓢啊!
這樣外部調(diào)用的時(shí)候就如我們上面所想的樣子了
[UILabel dcMaker_creat].frame(CGRectMake(100, 200, 100, 50))
.text(@"this is a label")
.textColor([UIColor redColor])
.font(15).fontWeight(UIFontWeightMedium)
.textAlignment(NSTextAlignmentLeft)
.numberOfLines(2)
.intoView(self.view);
參考鏈接:https://blog.csdn.net/cAj3Z1hurtGNR2/article/details/78103850
代碼鏈接:https://github.com/daichuan/DCViewMaker/tree/master