iOS-使用代碼約束佈局(Masonry)

来源:http://www.cnblogs.com/soley/archive/2016/06/02/5553448.html
-Advertisement-
Play Games

一、引子 學完了可視化編程的Xib和Storyboard,LZ對它們的感受就是的就是UI控制項創建直接拖拽,尺寸適配加約束,Storyboard的頁面跳轉邏輯清晰可見,比起代碼佈局節省了很多的工作量。但是LZ相信還是很多人喜歡用純代碼來編寫一個程式的(LZ就是一個,用代碼寫出來東西的成就感很足!),所 ...


  一、引子

  學完了可視化編程的Xib和Storyboard,LZ對它們的感受就是的就是UI控制項創建直接拖拽,尺寸適配加約束,Storyboard的頁面跳轉邏輯清晰可見,比起代碼佈局節省了很多的工作量。但是LZ相信還是很多人喜歡用純代碼來編寫一個程式的(LZ就是一個,用代碼寫出來東西的成就感很足!),所以今天在這裡給喜愛純代碼編程的程式猿們介紹一下純代碼約束佈局的工具——Masonry。

  二、Masonry介紹

  Masonry源碼下載地址:https://github.com/SoleMY/Masonry

  Masonry是一個輕量級的佈局框架 擁有自己的描述語法 採用更優雅的鏈式語法封裝自動佈局 簡潔明瞭 並具有高可讀性 而且同時支持 iOS 和 Max OS X。

  Masonry支持的屬性:

/// 左側
@property (nonatomic, strong, readonly) MASConstraint *left;
/// 上側
@property (nonatomic, strong, readonly) MASConstraint *top;
/// 右側
@property (nonatomic, strong, readonly) MASConstraint *right;
/// 下側
@property (nonatomic, strong, readonly) MASConstraint *bottom;
/// 首部
@property (nonatomic, strong, readonly) MASConstraint *leading;
/// 底部
@property (nonatomic, strong, readonly) MASConstraint *trailing;
///
@property (nonatomic, strong, readonly) MASConstraint *width;
///
@property (nonatomic, strong, readonly) MASConstraint *height;
/// 橫向中點
@property (nonatomic, strong, readonly) MASConstraint *centerX;
/// 縱向中點
@property (nonatomic, strong, readonly) MASConstraint *centerY;
/// 文本基線
@property (nonatomic, strong, readonly) MASConstraint *baseline;

// 在Masonry的源碼中我們可以看到他們對應的NSLayoutAttribute的屬性對應如下
- (MASConstraint *)left {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft];
}

- (MASConstraint *)top {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTop];
}

- (MASConstraint *)right {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRight];
}

- (MASConstraint *)bottom {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottom];
}

- (MASConstraint *)leading {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeading];
}

- (MASConstraint *)trailing {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailing];
}

- (MASConstraint *)width {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeWidth];
}

- (MASConstraint *)height {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeHeight];
}

- (MASConstraint *)centerX {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterX];
}

- (MASConstraint *)centerY {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterY];
}

- (MASConstraint *)baseline {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBaseline];
}

  iOS8之後Masonry新出了幾個屬性:

/// 距離邊框的距離,等同於選中Storyboard的Constrain to margins後加約束
@property (nonatomic, strong, readonly) MASConstraint *leftMargin;
@property (nonatomic, strong, readonly) MASConstraint *rightMargin;
@property (nonatomic, strong, readonly) MASConstraint *topMargin;
@property (nonatomic, strong, readonly) MASConstraint *bottomMargin;
@property (nonatomic, strong, readonly) MASConstraint *leadingMargin;
@property (nonatomic, strong, readonly) MASConstraint *trailingMargin;
@property (nonatomic, strong, readonly) MASConstraint *centerXWithinMargins;
@property (nonatomic, strong, readonly) MASConstraint *centerYWithinMargins;

- (MASConstraint *)leftMargin {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeftMargin];
}

- (MASConstraint *)rightMargin {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRightMargin];
}

- (MASConstraint *)topMargin {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTopMargin];
}

- (MASConstraint *)bottomMargin {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottomMargin];
}

- (MASConstraint *)leadingMargin {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeadingMargin];
}

- (MASConstraint *)trailingMargin {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailingMargin];
}

- (MASConstraint *)centerXWithinMargins {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterXWithinMargins];
}

  三、代碼示例

#import "RootViewController.h"
// 引入頭文件
#import "Masonry.h"
@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
#pragma mark label
    
    // 添加約束,不需要設置frame
    UILabel *label = [UILabel new];
    label.backgroundColor = [UIColor redColor];
    // 添加父視圖,視圖添加完成後才能進行佈局
    [self.view addSubview:label];
    
    // 佈局實現label方法
    [label mas_makeConstraints:^(MASConstraintMaker *make) {
        // 距離上邊50
        // make:相當於你要佈局的視圖
        // equalTo(參照視圖對象),如果參照視圖是self.view,可以不設置參照視圖的屬性
        // offset(距離數值)
        make.top.equalTo(self.view).offset(50);
        
        // 距離左邊100
        make.left.equalTo(self.view).offset(100);
        
        // 距離右邊100
        make.right.equalTo(self.view).offset(-100);
        
        // 距離下邊500
        make.bottom.equalTo(self.view).offset(-500);
        
    }];
#pragma mark label1
    UILabel *label1 = [UILabel new];
    label1.backgroundColor = [UIColor greenColor];
    [self.view addSubview:label1];
    
    // 佈局實現label1方法
    // 先佈局參照視圖,否則約束容易丟失
    [label1 mas_makeConstraints:^(MASConstraintMaker *make) {
        // equalTo(自定義視圖),需要設置視圖的屬性
        // 如果數值為0,可以不寫offset()
        make.top.equalTo(label.mas_bottom).offset(50);
        make.leading.equalTo(label.mas_leading);
        make.trailing.equalTo(label.mas_trailing);
        // 高度60
        // mas_equalTo(數值)
        make.height.mas_equalTo(60);
        
    }];
    
#pragma mark label2
    UILabel *label2 = [UILabel new];
    label2.backgroundColor = [UIColor grayColor];
    [self.view addSubview:label2];
    
    // 設置距離參照視圖的內邊距 (上左下右)
    UIEdgeInsets padding = UIEdgeInsetsMake(400, 100, 100, 100);
    
    // 佈局實現label2方法
    // 先佈局參照視圖,否則約束容易丟失
    [label2 mas_makeConstraints:^(MASConstraintMaker *make) {
        // 設置約束視圖的邊界距離self.view的邊界值
        make.edges.equalTo(self.view).insets(padding);
        
//        make.top.equalTo(self.view).offset(400);
//        make.left.equalTo(self.view).offset(100);
//        make.right.equalTo(self.view).offset(-100);
//        
//        make.bottom.equalTo(self.view).offset(-100);
        
    }];
#pragma mark label3
    UILabel *label3 = [UILabel new];
    label3.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:label3];
    
    [label3 mas_makeConstraints:^(MASConstraintMaker *make) {
        // 設置中心點一致
        make.center.equalTo(label2);
        
        // 設置大小
        // make.width = label2.width - 40
        // make.heigth = label2.height - 60
        make.size.equalTo(label2).sizeOffset(CGSizeMake(-40, -60));
    }];

    
}

@end

  在這裡只是給大家舉幾個簡單的例子(效果圖):

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 具體效果 ...
  • 1.什麼是3G 3G,全稱為3rd Generation,中文含義就是指第三代數字通信。 所謂3G,是指將無線通信與國際互聯網等多媒體通信結合的新一代移動通信系統。 3G只是一種通信技術標準,符合這個標準的技術有WCDMA、CDMA2000、TD-SCDMA三種制式。中國聯通使用的是WCDMA(世界 ...
  • 本次博客是一篇總結性質的博客,總結的是各種創建控制器的方式以及一些需要註意的操作。 1、通過storyboard創建控制器 正如我上一篇博客中所說,當 Main Interface 沒有選定的時候,我們一般只能通過代碼來創建一個 UIWindow,不再使用系統創建好的 Main.storyboard ...
  • Linux文件的訪問許可權* 在Android中,每一個應用是一個獨立的用戶* drwxrwxrwx* 第1位:d表示文件夾,-表示文件* 第2-4位:rwx,表示這個文件的擁有者(創建這個文件的應用)用戶對該文件的許可權 * r:讀 * w:寫 * x:執行* 第5-7位:rwx,表示跟文件擁有者用戶 ...
  • github地址 先安裝homeBrew command script import /usr/local/opt/chisel/libexec/fblldb.py WTF?沒有許可權?嘗試提升許可權安裝 sudo brew install chisel 直接報錯,拒絕執行。 嘗試 command sc ...
  • 最近仿照QQ聊天做了一個類似界面,先看下界面組成(畫面不太美湊合湊合唄,,,,): 其中聊天背景可以是一個LinearLayout或者RelativeLayout裡面存放的是ListView(將ListView的分割線設置成透明:android:divider="#0000"否則聊天界面會顯示出分割 ...
  • #單元測試junit* 定義一個類繼承AndroidTestCase,在類中定義方法,即可測試該方法 * 在指定指令集時,targetPackage指定你要測試的應用的包名 <instrumentation android:name="android.test.InstrumentationTest ...
  • SmartFoxServer 是專門為Adobe Flash設計的跨平臺socket伺服器,讓開發者高效地開發多人應用及游戲. 該伺服器主要用來創建多玩家游戲。並提供強大的製作工具,各種回合制游戲和實時游戲都可以勝任。 SmartFoxServer 支持的播放器從Flash player6版到最新的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...