iOS 開發探索-鏈式編程實戰
“天下武功,無快不破”,求上天眷顧,愿各位技術大神來打通我的任督二脈,從此啟動開掛模式,在技術進階之路上狂奔.
最近項目開發中用到了Masonry框架
Masonry是一個輕量級的布局框架,擁有自己的描述語法,采用更優雅的鏈式語法封裝自動布局 ,簡潔明了,并具有高可讀性,而且同時支持 iOS 和 Max OS X。
我們先來看一段官方的sample code來認識一下Masonry
[viewmas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
相信各位大神早就熟知Masonry 這個開源框架,它主要采用鏈式編程思想.
鏈式編程思想:是將多個操作(多行代碼)通過點號(.)鏈接在一起成為一句代碼,使代碼可讀性好。a(1).b(2).c(3)
鏈式編程特點:方法的返回值是block,block必須有返回值(本身對象),block參數(需要操作的值)
讓我們來思考以下代碼示例:
UIView *redView = [UIViewnew];
redView.X(100).Y(20).Width(50).Height(100);
redView.backgroundColor = [UIColorredColor];
[self.viewaddSubview:redView];
UIView *blueView = [UIViewnew];
blueView.Center(CGPointMake(150, 300)).Size(CGSizeMake(100, 50));
blueView.backgroundColor = [UIColorblueColor];
[self.viewaddSubview:blueView];
大家有沒有對以上代碼布局感到奇怪,和我們通常的 frame 布局有所出入,請繼續向下瀏覽
按照鏈式編程思想,本人對 UIVIew+Frame 這個布局分類做了簡單擴展.
UIView+Frame.h 頭文件
#import
@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"
@implementationUIView (Frame)
- (UIView* (^)(CGFloat))X
{
return ^UIView*(CGFloat x){
CGRectframe = self.frame;
frame.origin.x = x;
self.frame = frame;
return self;
};
}
- (UIView* (^)(CGFloat))Y
{
return ^UIView*(CGFloat y){
CGRectframe = self.frame;
frame.origin.y = y;
self.frame = frame;
return self;
};
}
- (UIView* (^)(CGFloat))Width
{
return ^UIView*(CGFloatwidth){
CGRectframe = self.frame;
frame.size.width = width;
self.frame = frame;
return self;
};
}
- (UIView* (^)(CGFloat))Height
{
return ^UIView*(CGFloatheight){
CGRectframe = self.frame;
frame.size.height = height;
self.frame = frame;
return self;
};
}
- (UIView* (^)(CGFloat))CenterX
{
return ^UIView*(CGFloatcenterX){
CGRectframe = self.frame;
frame.origin.x = centerX;
self.frame = frame;
return self;
};
}
- (UIView* (^)(CGFloat))CenterY
{
return ^UIView*(CGFloatcenterY){
CGRectframe = self.frame;
frame.origin.y = centerY;
self.frame = frame;
return self;
};
}
- (UIView* (^)(CGSize))Size
{
return ^UIView*(CGSizesize){
CGRectframe = self.frame;
frame.size = size;
self.frame = frame;
return self;
};
}
- (void)setX:(CGFloat)x
{
CGRectframe = self.frame;
frame.origin.x = x;
self.frame = frame;
}
- (CGFloat)x
{
return self.frame.origin.x;
}
- (void)setY:(CGFloat)y
{
CGRectframe = self.frame;
frame.origin.y = y;
self.frame = frame;
}
- (CGFloat)y
{
return self.frame.origin.y;
}
- (void)setWidth:(CGFloat)width
{
CGRectframe = self.frame;
frame.size.width = width;
self.frame = frame;
}
- (CGFloat)width
{
return self.frame.size.width;
}
- (void)setHeight:(CGFloat)height
{
CGRectframe = 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{
CGRectframe = self.frame;
frame.size = size;
self.frame = frame;
}
- (CGFloat)centerX{
return self.frame.origin.x;
}
- (void)setCenterX:(CGFloat)centerX{
CGRectframe = self.frame;
frame.origin.x = centerX;
self.frame = frame;
}
- (CGFloat)centerY{
return self.frame.origin.y;
}
- (void)setCenterY:(CGFloat)centerY{
CGRectframe = self.frame;
frame.origin.y = centerY;
self.frame = frame;
}
@end
筆者做為一名屌絲程序員,每天都在技術路上前行,由于本人天生愚鈍,學藝不精,在此獻丑啦!
本文由用戶 r7AkGyjh 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!