1. 程式人生 > >Masonry介紹與使用實踐(快速上手Autolayout)

Masonry介紹與使用實踐(快速上手Autolayout)

前言

1
MagicNumber -> autoresizingMask -> autolayout

以上是純手寫程式碼所經歷的關於頁面佈局的三個時期

  • 在iphone1-iphone3gs時代 window的size固定為(320,480) 我們只需要簡單計算一下相對位置就好了

  • 在iphone4-iphone4s時代 蘋果推出了retina屏 但是給了碼農們非常大的福利:window的size不變

  • 在iphone5-iphone5s時代 window的size變了(320,568) 這時autoresizingMask

    派上了用場(為啥這時候不用Autolayout? 因為還要支援ios5唄) 簡單的適配一下即可

  • 在iphone6+時代 window的width也發生了變化(相對5和5s的螢幕比例沒有變化) 終於是時候拋棄autoresizingMask改用autolayout了(不用支援ios5了 相對於螢幕適配的多樣性來說autoresizingMask也已經過時了)

那如何快速的上手autolayout呢? 說實話 當年ios6推出的同時新增了autolayout的特性 我看了一下官方文件和demo 就立馬拋棄到一邊了 因為實在過於的繁瑣和囉嗦(有過經驗的朋友肯定有同感)

直到iphone6釋出之後 我知道使用autolayout勢在必行了 這時想起了以前在瀏覽Github看到過的一個第三方庫Masonry 在花了幾個小時的研究使用後 我就將autolayout掌握了(重點是我並沒有學習任何的官方文件或者其他的關於autolayout的知識

) 這就是我為什麼要寫下這篇文章來推薦它的原因

介紹

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

我們先來看一段官方的sample code來認識一下Masonry

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

看到block裡面的那句話: make edges equalTo superview with insets


通過鏈式的自然語言 就把view1給autolayout好了 是不是簡單易懂? 

使用

看一下Masonry支援哪一些屬性

1234567891011
@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;

這些屬性與NSLayoutAttrubute的對照表如下

Masonry NSAutoLayout 說明
left NSLayoutAttributeLeft 左側
top NSLayoutAttributeTop 上側
right NSLayoutAttributeRight 右側
bottom NSLayoutAttributeBottom 下側
leading NSLayoutAttributeLeading 首部
trailing NSLayoutAttributeTrailing 尾部
width NSLayoutAttributeWidth
height NSLayoutAttributeHeight
centerX NSLayoutAttributeCenterX 橫向中點
centerY NSLayoutAttributeCenterY 縱向中點
baseline NSLayoutAttributeBaseline 文字基線

其中leading與left trailing與right 在正常情況下是等價的 但是當一些佈局是從右至左時(比如阿拉伯文?沒有類似的經驗) 則會對調 換句話說就是基本可以不理不用 用left和right就好了

在ios8釋出後 又新增了一堆奇奇怪怪的屬性(有興趣的朋友可以去瞅瞅) Masonry暫時還不支援(不過你要支援ios6,ios7 就沒必要去管那麼多了)

在講例項之前 先介紹一個MACRO

1
#define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self;

快速的定義一個weakSelf 當然是用於block裡面啦 下面進入正題(為了方便 我們測試的superView都是一個size為(300,300)的UIView)

下面 通過一些簡單的例項來簡單介紹如何輕鬆愉快的使用Masonry:

1. [基礎] 居中顯示一個view

1234567891011121314151617
- (void)viewDidLoad{    [super viewDidLoad];    // Do any additional setup after loading the view.    WS(ws);    UIView *sv = [UIView new];    [sv showPlaceHolder];    sv.backgroundColor = [UIColor blackColor];    [self.view addSubview:sv];    [sv mas_makeConstraints:^(MASConstraintMaker *make) {        make.center.equalTo(ws.view);        make.size.mas_equalTo(CGSizeMake(300, 300));    }];}

程式碼效果程式碼效果

使用我之間寫的MMPlaceHolder 可以看到superview已經按照我們預期居中並且設定成了適當的大小

那麼先看看這幾行程式碼 

12345678910111213141516
//從此以後基本可以拋棄CGRectMake了UIView *sv = [UIView new];//在做autoLayout之前 一定要先將view新增到superview上 否則會報錯[self.view addSubview:sv];//mas_makeConstraints就是Masonry的autolayout新增函式 將所需的約束新增到block中行了[sv mas_makeConstraints:^(MASConstraintMaker *make) {	//將sv居中(很容易理解吧?)    make.center.equalTo(ws.view);    //將size設定成(300,300)    make.size.mas_equalTo(CGSizeMake(300, 300));

相關推薦

Masonry介紹使用實踐(快速上手Autolayout)

前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是純手寫程式碼所經歷的關於頁面佈局的三個時期 在iphone1-iphone3gs時代

Masonry介紹使用實踐(快速上手Autolayout)-讓IOS自動化相對佈局更簡單

前言 MagicNumber -> autoresizingMask -> autolayout 以上是純手寫程式碼所經歷的關於頁面佈局的三個時期 在iphone1-iphone3gs時代 window的size固定為(320,480) 我們只需

IOS Masonry介紹使用實踐快速上手Autolayout

前言 MagicNumber -> autoresizingMask -> autolayout 以上是純手寫程式碼所經歷的關於頁面佈局的三個時期 在iphone1-iphone3gs時代 window的size固定為(320,480) 我

關於RestFul API 介紹實踐

clas 分享 ice div 之前 api 設計 article alt 之前演示的PPT,直接看圖。。。 ?參考鏈接: ?RESTful API 設計最佳實踐 ?RESTful API 設計指南 ?SOAP webserivce和 RESTfulwebse

ssh批量管理分發項目實戰介紹實踐

linuxssh認證類型:基於口令的安全驗證,批量管理?expect,pssh,sshpassm01機器(鑰匙)私鑰被管理機器(鎖)公鑰 m01nfs01backupweb011、在上面4臺機器上面操作:創建用戶及密碼useradd oldgirlecho 123456|passwd --stdin

趣味花體模糊字體玩法介紹實踐

level 1.0 hide ros color prior dst ora ansi 當你在網上看到這樣的字的時候,你的內心一定很奇怪這種字是怎麽輸入的: ?擼?的?太?多?眼?會?花? ?水?的?太?快?會?禁?言? ??擼????的????太?

WPF: 只讀依賴屬性的介紹實踐

val 包括 結合 通過 觸發 clas 就是 post 能夠 在設計與開發 WPF 自定義控件時,我們常常為會控件添加一些依賴屬性以便於綁定或動畫等。事實上,除了能夠添加正常的依賴屬性外,我們還可以為控件添加只讀依賴屬性(以下統稱“只讀屬性”),以增加控件的靈活性。 這聽

二、Linux系統硬鏈接和軟鏈接詳細介紹實踐

導致 9.png 創建 訪問 tap 除了 all window tor 鏈接的概念 在linux系統中,鏈接可分為兩種:一種被稱為硬鏈接(Hard LinK),另一種被稱為軟鏈接或符號鏈接(Symbolic Link)。在默認不帶參數的情況下,執行ln命令創建的鏈

RabbitMQ交換器Exchange介紹實踐

屬性 上傳 rri dem index 斷開 shutdown 不能 type 本章我們重點學習一下Rabbit裏面的exchange(交換器)的知識。 交換器分類 RabbitMQ的Exchange(交換器)分為四類: direct(默認)headersfanoutt

Prometheus的介紹實踐

一、Prometheus簡介 Prometheus是一套開源的系統監控報警框架。Prometheus作為新一代的雲原生監控系統,相比傳統監控監控系統(Nagios或者Zabbix)擁有如下優點。 易管理性 Prometheus: Prometheus核心部分只有一個單獨的二進位制檔案,可

OpenBLAS LAPACK快速上手

1. OpenBLAS 1.1 Build make -j4 make install PREFIX=xxx 1.2 References 1.3 Examples ex

[TensorFlow]生成對抗網路(GAN)介紹實踐

主旨本文簡要介紹了生成對抗網路(GAN)的原理,接下來通過tensorflow開發程式實現生成對抗網路(GAN),並且通過實現的GAN完成對等差數列的生成和識別。通過對設計思路和實現方案的介紹,本文可以輔助讀者理解GAN的工作原理,並掌握實現方法。有了這樣的基礎,在面對工作中實際問題時可以將GAN納入考慮,選

多region介紹實踐

Region 每個region都有個完整的Openstack部署環境, 有自己的一套服務的endpoint(服務入口)。 不同的region共享一套keystone和horizon來提供訪問控制與web操作,regions之間完全隔離,但是多個regions之間共享同一個k

網路模擬NS2之——TCL語言介紹實踐

摘要 NS2網路模擬軟體主要用到了TCL語言,TCL語言是很容易上手的。本文希望把TCL語言的基本語法和應用講簡單了,使得讀者對NS2軟體的應用有進一步的認識和實踐。 1. 變數宣告 set name "Joe"puts "my name is $name" 2.

python編程快速上手之第10章實踐項目參考答案(11.11.2)

答案 nic .com final timeout pre image 保存圖片 iframe #!/usr/bin/env python # -*- coding:utf-8 -*- import os import re import urllib import

python編程快速上手之第10章實踐項目參考答案(11.11.3)

name driver ret text rul from url .get right from selenium import webdriver from selenium.webdriver.common.keys import Keys import time

python編程快速上手之第10章實踐項目參考答案(12.13.1)

true style span tip 12.1 user python input multi #! python3 # multiplicationTable.py import openpyxl,os from openpyxl.styles import Font

python編程快速上手之第13章實踐項目參考答案(13.6.1)

encrypted iter close ffi mes python編程 實踐項目 reader blog import os,PyPDF2 os.chdir(‘D:\\My Documents‘) for folderName, subfolders, filenam

python編程快速上手之第13章實踐項目參考答案(13.6.2)

nbsp python add sha odi log span import imp #! python3 # encoding: UTF-8 import os import docx from docx import Document from docx.shar

python編程快速上手之第15章實踐項目參考答案(17.7.2)

col ges code sid documents mod 編程 bsp tof #! python3 # Import modules and write comments to describe this program. import zipfile, os fr