寒哥細談之AutoLayout全解

看到群中好多朋友還停留在Frame布局的痛苦時代,以及有些開發者接手別人的就項目發現布局一團亂。
而且沒有啟動圖的時候并不是真正真正適配iPhone 6(S)、iPhone6(S) Plus等設備 。
寒哥準備盡可能詳細的講一講我所掌握的AutoLayout 。

AutoLayout很難?
我覺得AutoLayout的難的、約束的選擇性太多,抽象性增加,大家直接看書或者看博客不太好理解,但是有人教的話還是挺快的。所以我盡量用GIF的方式給大家展現。

AutoLayout是什么?

  • Autolayout是一種布局技術,專門用來布局UI界面的。用來取代Frame布局在遇見屏幕尺寸多重多樣的不足

  • Autolayout自iOS6開始引入,由于Xcode4的不給力,當時并沒有得到很大的推廣

  • 在iOS7(Xcode5)開始,Autolayout的開發效率得到很大的提升

蘋果官方也推薦開發者盡量使用Autolayout來布局UI界面
Autolayout能輕松的解決屏幕適配的問題


AutoLayout從哪里入手?

1.gif

自 從Xcode6之后,你會看到我們新建一個Single Application,會發現一個ViewController的View非常大,跟任何一個iPhone/iPad的尺寸都不一樣,這些都是假象、假 象、假象。Apple 把尺寸抽象為了一個正方形,到真正的設備上才是真正的布局。
AutoLayout+IB中操作的屬性介紹

2.png3.png4.png

我們會發現貌似這個玩意好多配置,貌似很麻煩的樣子。下面我們挨個講解:
1.相對處理(Pin):

5.png

屬性說明:
1:距離邊緣 最上面的4個虛線表示某個View的距離上邊、左邊、右邊、下邊多高。
2:那個藍色的Constrain To Margins 是iPhone6出現之后。
Apple 覺得更大的分辨率有點間距好看,默認為8,如果這個勾上了,這個View距離四周的值就變成了你輸入的值+8。 一般建議勾掉 。
let`s Play
我們開始Demo前先想想我們在Frame時代,布局需要什么:

1
2
3
4
{
original:{x,y}
size:{width,height}
}

在iOS中布局是絕對定位的(大致這么理解吧)。
所以我們需要某個View的X,Y,W,H
我們從基本的入門 ,我們無論添加多少約束,都是需要定位好某個View的X,Y,W,H。

少了不行,多了更不行。

少了不行,多了更不行。

少了不行,多了更不行。

重要的事情說三遍。這里先不討論UIlabel、UITextView、UIImageView等自帶的內建高度。

  • Demo 1.某個View距離父View上下左右間距全部為20。

6.png

請注意我這里把距離下面的,也就是BottomLayoutGuide的約束改成了距離控制器的View,為什么?

因為BottomLayoutGuide是晚于View加載的,如果參考這個,會造成進入頁面會卡一下。盡量不要直接參考下面 TopLayoutGuide 則沒事。

加完約束你會發現貌似并沒有什么效果?

不是的,屏幕中出現的黃色的線條 ,這是IB在提升我們你所添加的約束 。和真實的尺寸不一樣,怎么修改?繼續圖:

7.gif

屬性說明3,4 固定某個View的寬高。

  • Demo 2.某個View距離在父View的左側20,上20,寬高為:100,100。

8.gif

注意我在添加約束的時候有個選項叫做updateFrame,如果勾選會直接將Frame調整到真實值,而不需要再次update 。
這里我們只是講了最簡單定位單個View,你會覺得和Frame并沒有什么區別 。

區別在于:AutoLayout的核心是參照,也就是基本上任何一個View都可以參照另一個View。

接下來講解Pin里面第5,6個屬性:

equal、Width、equal、Height,選中的多個View寬高相等。

  • Demo 3.某個View距離在父View的左側20,demo2中白色View,上20,寬高和Demo2中的寬高一樣。

9.gif

屬性6.AspectRatio比例。
假設某個View距離父View右上角20 ,20 寬高比 2:1 寬100。

10.gif

第七個屬性Align其實在第一個面板中已經有了,放在下一部分講解。
是時候給講解下約束是什么玩意了剛才你看到我對約束修改了。
我們點擊下某個約束。

11.gif

AutoLayout的公式

1
2
3
第一個Item的屬性=?(=?)第二個Item的屬性*Multiplier+Constant
第一個Item的屬性=?(=?)第二個Item的屬性*Multiplier+Constant
第一個Item的屬性=?(=?)第二個Item的屬性*Multiplier+Constant

比如圖中的View 約束 可以理解為:View的tralling(右側) 等于(eauql) 1倍(multpiler)的控制的右側 + 20(constant)

1
2
注意比例是支持表達式的?如?2:3
releation是支持great?than??lessthan

具體是多少 系統自動算出
2. 對齊處理(Align)

12.png

介紹:
屬性說明:
Leading Edges:左對齊
Trailing Edges:右對齊
Top Edges:上對齊
Bottom Edges:下對齊
Horizontal Centers:水平中心對齊
Vertical Centers:豎向中心對齊
Baselines:基線對齊
Horizontal Center in Container:對齊容器中的水平中心
Vertical Center in Container:對齊容器中的豎向中心
Demo 4.某個View距離在父View的右側20,demo3中白色View上20,寬高和Demo3中的寬高一樣,并且有對齊。

13.png

Demo5.某個View 居中與父View 長寬50。

14.gif

某些控件是有baseLine的,如UILabel、UITextView,看下不同吧。
Demo6.某個label和另外一個label基線對。

15.gif

3. UILabel內建高度自適應高度
像label ,默認是有寬度的,寬度就是字體自適應的。
這樣我們就可以不給UIlabel高度,把Label的NumberOfline = 0就可以自適應高度了。
Demo7.Label自適應高度:

16.gif

4. 小技巧
1.有時候約束太多的時候,我們可以給某個View起個假名字,就能很方便的看到是哪個View了。
2.View總是選不中按 ctrl + shift + 單擊。

17.gif

3.AutoLayout遇見ScrollView。
參看這個文章《AutoLayout深入淺出三[相遇Scrollview]》,如圖

19.png

  • Demo 8.ScrollView過長,無法編輯怎么辦?

20.gif

將控制器改為Freedom,修改ContentView的高度約束,這樣ScrollView就可以滾動了,也可以往下編輯了。

5.AutoLayout遇見UItableViewCell

AutoLayout深入淺出四[不僅是UIWebView與UITableView的糾纏]

AutoLayout深入淺出五[UITableView動態高度]

動態計算UITableViewCell高度詳解

以上4個為講解 。

下面實踐:

https://github.com/forkingdog/UITableView-FDTemplateLayoutCell博客講解

6.個人寫的小技巧

《AutoLayout分分鐘搞定等比例布局》

《友好的ContainerView&AutoLayout資料推薦》

7.iOS 9及AutoLayout的注意點:
當然也是我寫的。AutoLayout好多好多不懂的,終于明白了。
總結:在StoryBoard里面開發其實就是拿著ViewController當做View用,如果你還是覺得復雜,可以把View抽象出去。

轉載于:https://www.cnblogs.com/Free-Thinker/p/5158461.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272408.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272408.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最難學的5種編程語言排行

每個程序員都熟悉許多編程語言。許多編程語言都是高級的,它們的語法是人類可讀的。然而,也有一些低級語言,對于一個人來說,讀起來很困難,但是可以理解。然而,您是否遇到過一種既不可讀又不可理解的編程語言…

[小北De編程手記] : Lesson 02 - Selenium For C# 之 核心對象

從這一篇開始,開始正式的介紹Selenium 以及相關的組件,本文的將討論如下問題: Selenium基本的概念以及在企業化測試框架中的位置Selenium核心對象(瀏覽器驅動) Web DriverSelenium核心對象(Dom元素&#xf…

Java中HashMap的entrySet()你會用了嗎

Map中存放的元素均為鍵值對&#xff0c;故每一個鍵值對必然存在一個映射關系。 Map中采用Entry內部類來表示一個映射項&#xff0c;映射項包含Key和Value Map.Entry里面包含getKey()和getValue()方法 Set<Entry<T,V>> entrySet() 該方法返回值就是這個map中各個鍵…

JS獲取請求URL相關參數

今天在找獲取當前網址除去參數的js方式&#xff0c;結果自己會的竟然只有window.location.href 先看一個示例 用javascript獲取url網址信息 <script type"text/javascript"> document.write("location.host"location.host"<br>"); d…

wiki語法大全

Wiki語法大全 編輯一個維客頁面十分容易。只要點擊頁面上方的“編輯本頁”或右側的[編輯]鏈接即可修改該頁&#xff0c;或點擊“討論本頁”然后再點擊“編輯頁面”來討論該頁面。點擊后您就會看到一個包含那個Wiki頁面的可編輯的文字區域。 先將文字復制到您最喜歡的文字編輯器…

驅動認知

用戶態 App&#xff1a;cp指令&#xff0c;ftp的項目等等這就是App的開發。 App開發需要C的基礎和C庫&#xff0c;C庫講到文件&#xff0c;進程&#xff0c;進程間通信&#xff0c;線程&#xff0c;網絡&#xff0c;界面&#xff08;GTk&#xff09;。 C庫&#xff08;是linux標…

TreeMap實現排序

TreeMap TreeMap實現SortMap接口&#xff0c;能夠把它保存的記錄根據鍵排序&#xff0c;默認是按鍵值的升序排序&#xff0c;也可以指定排序的比較器。當用Iterator遍歷TreeMap時&#xff0c;得到的記錄是排過序的。 TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或…

圖解分布式架構的演進過程!

一、什么是分布式架構分布式系統&#xff08;distributed system&#xff09; 是建立在網絡之上的軟件系統。內聚性&#xff1a;是指每一個數據庫分布節點高度自治&#xff0c;有本地的數據庫管理系統。透明性&#xff1a;是指每一個數據庫分布節點對用戶的應用來說都是透明的&…

CSS 布局實例系列(四)如何實現容器中每一行的子容器數量隨著瀏覽器寬度的變化而變化?...

Hello&#xff0c;小朋友們&#xff0c;還記得我是誰嗎&#xff1f;對了&#xff0c;我就是~超威~好啦&#xff0c;言歸正傳&#xff0c;今天的布局實例是&#xff1a; 實現一個浮動布局&#xff0c;紅色容器中每一行的藍色容器數量隨著瀏覽器寬度的變化而變化&#xff0c;就如…

基于框架編寫驅動代碼

操作驅動的上層代碼&#xff08;pin4test&#xff09; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>void main() {int fd,data;fd open("/dev/pin4",O_RDWR);if(fd<0){printf("open fail…

nacos在windows下安裝

1:訪問https://github.com/alibaba/nacos/releases下載nacos 2:下載到本地解壓 3:點擊startup.cmd 啟動nacos 4:訪問 http://127.0.0.1:8848/nacos 輸入賬號和密碼&#xff0c;nacos/nacos

關于SQL優化這些你了解嗎?

背景在當今這個互聯網的時代無非要解決兩大難題&#xff0c;其一是信息安全&#xff0c;其二就是數據的存儲。而信息安全則是在數據存儲的基礎之上。一個公司從剛開始成立到發展成一個有上百人甚至上千人團隊的時候&#xff0c;公司的業務量是呈上升趨勢&#xff0c;客戶及用戶…

圖片安全保護(未啟動)

圖片安全保護&#xff08;未啟動&#xff09; 圖片安全保護&#xff08;未啟動&#xff09;posted on 2016-01-27 22:54 代碼35 閱讀(...) 評論(...) 編輯 收藏 轉載于:https://www.cnblogs.com/xinglizhenchu/p/5164847.html

微機總線地址,物理地址 ,虛擬地址

總線地址 地址總線 (Address Bus&#xff1b;又稱&#xff1a;位址總線) 屬于一種電腦總線 &#xff08;一部份&#xff09;&#xff0c;是由CPU 或有DMA 能力的單元&#xff0c;用來溝通這些單元想要存取&#xff08;讀取/寫入&#xff09;電腦內存元件/地方的實體位址。 自己…

Navicat遠程連接linux下mysql服務器1045錯誤解決辦法在這兒

1&#xff1a;首先通過xshell工具或者你熟悉的工具連接遠程linux下的服務器 mysql -uroot -p 然后輸入密碼 2.進行授權 如果想root用戶使用password從任何主機連接到mysql服務器的話。 GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 你的mysql密碼 WITH GRANT O…

內存劃分

一、內存分配 一個由C/C編譯的程序占用的內存分為以下幾個部分 1、棧區&#xff08;stack&#xff09;&#xff1a; 由編譯器自動分配釋放 &#xff0c;存放函數的參數值&#xff0c;局部變量的值等。其操作方式類似于數據結構中的棧。 2、堆區&#xff08;heap&a…

樹莓派 博通BCM2835芯片手冊

手冊提取鏈接 鏈接&#xff1a;https://pan.baidu.com/s/1fdmIBNn1Pr1j3-ercNhKJg 提取碼&#xff1a;8y1b 驅動的兩大利器&#xff1a; 1、電路圖:通過電路圖找到寄存器 2、芯片手冊 樹莓派有54個通用IO口(0到53)&#xff0c;所有GPIO口至少有兩個可選功能&#xff08;輸入輸…

MVC實現實現文件流打包成壓縮包

MVC實現實現文件流打包成壓縮包1、使用壓縮類庫SharpZipLib SharpZipLib 是一款比較經典實用C#壓縮類庫SharpZipLib 庫特點&#xff1a;功能豐富、穩定 &#xff0c;支持主流 zip、Gzip Tar BZip2 格式2、項目中引用SharpZipLib的官方地址是&#xff1a;http://icsharpcode.git…

Intellij idea 報錯:Error : java 不支持發行版本5

idea運行出現了這個錯誤 解決辦法按下圖所示&#xff1a;

屬性“dataProvider”有多個初始值設定項。(注意:“dataProvider”是“mx.charts.BarChart”的默認屬性)。...

1、錯誤描寫敘述 屬性“dataProvider”有多個初始值設定項。&#xff08;注意:“dataProvider”是“mx.charts.BarChart”的默認屬性&#xff09;。2、錯誤原因 <?xml version"1.0" encoding"utf-8"?> <s:Application xmlns:fx"http://ns.…