iOS 開發探索-鏈式編程實戰

r7AkGyjh 8年前發布 | 5K 次閱讀 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!