iOS中AutoLayer自動布局流程及相關方法

關于UIView的Layer,IOS提供了三個方法:

1、layoutSubviews

系統重寫布局:在iOS5.1和之前的版本,此方法的缺省實現不會做任何事情(實現為空),iOS5.1之后(iOS6開始)的版本,此方法的缺省實現是使用你設置在此view上面的constraints(Autolayout)去決定subviews的position和size。 UIView的子類如果需要對其subviews進行更精確的布局,則可以重寫此方法。只有在autoresizingconstraint-based behaviors of subviews不能提供我們想要的布局結果的時候,我們才應該重寫此方法。可以在此方法中直接設置subviews的frame。 我們不應該直接調用此方法,而應當用下面兩個方法。

2、setNeedsLayout

此方法會將view當前的layout設置為無效的,并在下一個upadte cycle里去觸發layout更新。也就是說, ?告知頁面需要更新,但是不會立刻開始更新。執行后會立刻調用layoutSubviews。

3、layoutIfNeeded

告知頁面布局立刻更新, 它會強制立即進行layout, 從當前view開始,此方法會遍歷整個view層次(包括superviews)請求layout。因此,調用此方法會強制整個view層次布局。。所以一般都會和setNeedsLayout一起使用。如果希望立刻生成新的frame需要調用此方法,利用這點一般布局動畫可以在更新布局后直接使用這個方法讓動畫生效。

setNeedsDisplay

?

?

基于約束的AutoLayer的方法:

1、setNeedsUpdateConstraints

當一個自定義view的某個屬性發生改變,并且可能影響到constraint時,需要調用此方法去標記constraints需要在未來的某個點更新,系統然后調用updateConstraints.

2、needsUpdateConstraints

constraint-based layout system使用此返回值去決定是否需要調用updateConstraints作為正常布局過程的一部分。

3、updateConstraintsIfNeeded

立即觸發約束更新,自動更新布局。

4、updateConstraints

?自定義view應該重寫此方法在其中建立constraints. 注意:要在實現在最后調用[super updateConstraints]

?

Auto?Layout Process 自動布局過程

與使用springs and struts(autoresizingMask)比較,Auto layout在view顯示之前,多引入了兩個步驟:updating constraints 和laying out views。每一個步驟都依賴于上一個。display依賴layout,而layout依賴updating constraints。?updating constraints->layout->display

第一步:updating constraints,被稱為測量階段,其從下向上(from subview to super view),為下一步layout準備信息。可以通過調用方法setNeedUpdateConstraints去觸發此步。constraints的改變也會自動的觸發此步。但是,當你自定義view的時候,如果一些改變可能會影響到布局的時候,通常需要自己去通知Auto layout,updateConstraintsIfNeeded。

自定義view的話,通常可以重寫updateConstraints方法,在其中可以添加view需要的局部的contraints。

第二步:layout,其從上向下(from super view to subview),此步主要應用上一步的信息去設置view的center和bounds。可以通過調用setNeedsLayout去觸發此步驟,此方法不會立即應用layout。如果想要系統立即的更新layout,可以調用layoutIfNeeded。另外,自定義view可以重寫方法layoutSubViews來在layout的工程中得到更多的定制化效果。

第三步:display,此步時把view渲染到屏幕上,它與你是否使用Auto layout無關,其操作是從上向下(from super view to subview),通過調用setNeedsDisplay觸發,

因為每一步都依賴前一步,因此一個display可能會觸發layout,當有任何layout沒有被處理的時候,同理,layout可能會觸發updating constraints,當constraint system更新改變的時候。

需要注意的是,這三步不是單向的,constraint-based layout是一個迭代的過程,layout過程中,可能去改變constraints,有一次觸發updating constraints,進行一輪layout過程。

注意:如果你每一次調用自定義layoutSubviews都會導致另一個布局傳遞,那么你將會陷入一個無限循環中。?

如下圖:

轉載于:https://www.cnblogs.com/bigshow1949/p/6340784.html

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

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

相關文章

移動開發web第一天

一、適配問題解決方案:流式布局 viewport1、流式布局百分比布局,通過設置盒子的寬度為百分比來根據屏幕的大小進行伸縮,特點是不受固定像素的限制,內容向兩側填充2、viewport在移動端用來承載網頁的這個區域,就是我們…

均值濾波 中值濾波 高斯平滑濾波

均值濾波是典型的線性濾波算法,它是指在圖像上對目標像素給一個模板,該模板包括了其周圍的臨近像素(以目標象素為中心的周圍8個像素,構成一個濾波模板,即去掉目標像素本身),再用模板中的全體像素…

javaWeb開發總結 ---- 前端數據插入到后臺

一,概述: 本文主要描述如何將數據通過表單提交到后臺并插入到數據庫.其中后臺使用spring框架. 二,開發流程: 明確需求,即將什么數據插入到數據庫平臺搭建,配置spring, 數據庫&#…

對clear float 的理解

之前自己對于清除浮動的用法比較模糊 ,如果用到的話,一般都是采用簡單粗暴的方式解決,就是直接用overflow:hidden,但是越用久就會發現其實有BUG,這個BUG正是overflow:hidden帶來的,因…

【機器視覺】——相機標定降低重投影誤差方法

目錄 一、標定結果分析 二、影響標定誤差的原因 1、平面標定板黑白棋盤格的精度

linux 安裝RedisLive

為什么80%的碼農都做不了架構師?>>> RedisLive 用來監控Redis,便于redis性能分析 安裝步驟: 1.安裝pip(代碼參考:https://github.com/pypa/pip) 官方網站:https://pypi.python.org/…

高斯濾波和雙向濾波的區別與聯系

1. 簡介 圖像平滑是一個重要的操作,而且有多種成熟的算法。這里主要簡單介紹一下Bilateral方法(雙邊濾波),這主要是由于前段時間做了SSAO,需要用bilateral blur 算法進行降噪。Bilateral blur相對于傳統的高斯blur來說…

Eclipse變量名自動補全問題 自定義上屏按鍵為TAB

Eclipse空格等號等都可以上屏,這樣有時候輸入變量名再按空格就會自動補全,非常討厭。那么怎么辦呢? 1.首先你的Eclipse需要裝有 Eclipse plug-in development environment 和 Eclipse JDT Plug-in Developer Resources 或者直接去下載一個和…

Dreamweaver CS6 Mac破解版

介于之前小子分享的Mac版的Adobe的PS CS6和Illustrator CS6,有用戶要求小子分享下Dreamweaver,小子當然樂意效勞。 Dreamweaver CS6 是世界頂級軟件廠商Adobe推出的一套擁有可視化編輯界面,用于制作并編輯網站和移動應用程序的網頁設計軟件。…

【pyqt5學習】——graphicView顯示matplotlib圖像

目錄 一、導入模塊 二、自定義一個matplotlib窗口類Figure 三、利用QT_designer繪制窗口 四、寫邏輯代碼 五、結果展示 一、導入模塊 import matplotlibmatplotlib.use("Qt5Agg") from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg from matplo…

happens-before規則

1)程序順序規則:一個線程中的每個操作,happens-before于該線程中的任意后續操作。2)監視器鎖規則:對一個鎖的解鎖,happens-before于隨后對這個鎖的加鎖。3)volatile變量規則:對一個v…

what is ssao

說到ssao 就要從ao說起,ao,即間接環境光遮蔽技術。我們知道現實中的光線,除了來自太陽和電燈的直射光線以外,光線碰到物體以后,還會再次反射,折射,而再次反射折射的過程中,又會被其他…

【pyqt5學習】——groupBox顯示matplotlib圖像

目錄 一、導入模塊 二、創建matplotlib窗口類 三、qt_designer設計窗口 四、邏輯代碼 五、結果展示 一、導入模塊 import matplotlibmatplotlib.use("Qt5Agg") from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg from matplotlib.figure impor…

[BZOJ3545][ONTAK2010]Peaks

[BZOJ3545][ONTAK2010]Peaks 試題描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之間有雙向道路相連,共M條路徑,每條路徑有一個困難值,這個值越大表示越難走,現在有Q組詢問,每組詢問詢問從…

杭電1027Ignatius and the Princess II模擬

地址:http://acm.hdu.edu.cn/showproblem.php?pid1027 題目: Problem DescriptionNow our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now the BEelzebub has t…

angular 使用rxjs 監聽同級兄弟組件數據變化

angular 的官網給出了父子組件之間數據交互的方法,如ViewChild、EventEmitter 但是如果要在同級組件之間進行數據同步,似乎并沒有給出太多的信息。 有時候我們想,在一個組件中修改數據之后,馬上反映到另外一個組件中, …

OpenCV里IplImage的widthStep參數 和width參數

一直以為IplImage結構體中的widthStep元素大小等于width*nChannels,大錯特錯!(為了快速訪問,要內存對齊啊)查看OpenCV2.1的源碼,在src/cxcore/cxarray.cpp文件中,找到cvInitImageHeader函數&…

【數字信號處理】——Python頻譜繪制

# -*- coding: utf-8 -*- from matplotlib import pyplotpyplot.rcParams[font.sans-serif] [SimHei] pyplot.rcParams[axes.unicode_minus] Falseimport numpy as np import matplotlib.pyplot as pl import matplotlib import math import randomN 500 # 繪制點總數 fs 5…

Android開發:《Gradle Recipes for Android》閱讀筆記1.3

想命令行執行gradle的構建,可以通過提供的gradle wrapper或者安裝gradle。 構建android項目不需要安裝gradle,因為android studio已經包含gradle。"gradle wrapper"指的是根目錄下的gradlew和gradlew.bat腳本(結尾的w是wrapper的意…