iOS開(kāi)發(fā)-(自動(dòng)布局全解)

interfaceBuilder 自動(dòng)布局的約束

假設(shè)在xib中放入一個(gè)textview,那我們需要讓它在屏幕上完全顯示魁兼。

設(shè)置textview的絕對(duì)位置,在iPhone4上一點(diǎn)對(duì)應(yīng)2個(gè)像素咐汞,而在iphone6或者是在iphone6s上對(duì)應(yīng)的將是3個(gè)像素化撕,如是進(jìn)行橫豎屏切換侯谁,顯然iphone4的像素顯然就不合適了

textview.png

如何對(duì)控件添加約束

其實(shí)蘋(píng)果默認(rèn)識(shí)對(duì)每一個(gè)控件進(jìn)行自動(dòng)的auto layout 热芹,trait variations 的惨撇,只是這種默認(rèn)的視圖大小是600*600的尺寸伊脓,顯然這個(gè)大小也是不合適的

系統(tǒng)默認(rèn)的布局.png

使用約束布局一個(gè)界面

*注意點(diǎn)一:為textvie w添加約束后,就不可以在設(shè)置控件的frame。以后的動(dòng)畫(huà)也需要根據(jù)約束進(jìn)行操作报腔。

*注意點(diǎn)二:每一條約束就相當(dāng)于一個(gè)等式

設(shè)置控件的約束.png

改變約束的高度

設(shè)置約束的高度.png

在view上放置一個(gè)label,為 label添加約束株搔,右鍵label拖向view控件,松手纯蛾。

注意點(diǎn):藍(lán)色的指示線代表正常的約束纤房,橘黃色的約束代表的是約束被破壞了。

破壞的約束視圖.png

解決辦法:

解決png

此時(shí)翻诉,label于view之間約束的關(guān)系為:

label于vie w約束的關(guān)系.png

修改label的center的位置

修改label的位置約束.png

為vie w添加一個(gè)約束,為but ton添加約束

注意點(diǎn):添加同級(jí)約束蛾派,label和button之間約束時(shí),仍然是從lab e l右鍵拖至label典尾,松手
注意點(diǎn)2:修改同級(jí)約束的值科平,仍然是相同的做法髓考,而此時(shí)妓湘,我們要的是label按照l(shuí)abel進(jìn)行對(duì)齊豌研。因此,first iterm應(yīng)該是button晶衷,seconditerm應(yīng)該是label

為控制器視圖添加一個(gè)tabelview温眉,設(shè)置約束

注意點(diǎn):此時(shí)的ta be view 設(shè)置的top bottom屬性都是根據(jù)它最近的控件進(jìn)行的設(shè)置露懒。left right屬性是相對(duì)于父視圖進(jìn)行的設(shè)置

ta be view注意點(diǎn)視圖.png

自動(dòng)布局的方法就這樣了坎弯,接下來(lái)就是如何利用約束創(chuàng)建動(dòng)畫(huà)

讓autolayout正常工作撩炊,我們不可以直接的操作視圖的frame屬性,只可以利用約束創(chuàng)建autolayout動(dòng)畫(huà)

首先做一個(gè)點(diǎn)擊button按鈕,讓view的高度變化阅签,再次點(diǎn)擊button,高度返回原來(lái)的值衷戈。
創(chuàng)建一個(gè)NSLayoutConstraint屬性并關(guān)聯(lián)導(dǎo)航的高度約束
@IBOutlet var menuHeightConstraint : NSLayoutConstraint!

關(guān)聯(lián)高度.png

@IBAction func actionToggleMenu(_ sender: Any) { isMenuOpen = !isMenuOpen menuHeightConstraint.constant = isMenuOpen ? 200.0 : 60.0 titleLabel.text = isMenuOpen ? "select iterm" : "packing list" }
注意點(diǎn):我們修改了約束后,視圖的布局并不會(huì)立即進(jìn)行刷新,重繪。只是進(jìn)行一次標(biāo)記捂寿,會(huì)在之后的時(shí)間點(diǎn)進(jìn)行重繪治笨。這個(gè)時(shí)間點(diǎn)就是在調(diào)用layoutifneed方法之后。
核心代碼:
UIView.animate(withDuration: 1.0, delay: 0.0, usingSpringWithDamping: 0.4, initialSpringVelocity: 0.4, options: .curveEaseInOut, animations: { () -> Void in self.view.layoutIfNeeded()// }, completion: nil) }

接下來(lái)就是讓button按鈕旋轉(zhuǎn)一個(gè)角度:
let angle = self.isMenuOpen ? CGFloat(M_PI_4) : 0.0 self.buttonMenu.transform = CGAffineTransform(rotationAngle: angle)

查看一個(gè)控件所有的約束
for con in (titleLabel.superview?.constraints)! { print("->\(con.description)") }
點(diǎn)擊button的時(shí)候讓title label可以向左移動(dòng)100個(gè)點(diǎn),首先應(yīng)該從constraints屬性中找出這個(gè)label流济,改變它在x軸上的約束
for constraint in titleLabel.superview!.constraints { if constraint.firstItem as? NSObject == titleLabel && constraint.firstAttribute == .centerY { // constraint.constant = isMenuOpen ? 10 : 0.0 } }

那么怎樣通過(guò)約束修改創(chuàng)建動(dòng)畫(huà)呢,可以為每個(gè)約束分配一個(gè)標(biāo)示斤彼,可以更好地對(duì)約束進(jìn)行管理

約束標(biāo)示.png

if constraint.identifier == "TitleCenterY" { constraint.isActive = false; //移除之前的約束去团,需要添加一個(gè)新的約束 let newConstraint = NSLayoutConstraint(item: titleLabel, attribute: .centerY, relatedBy: .equal, toItem: titleLabel.superview, attribute: .centerY, multiplier: isMenuOpen ? 0.67 : 1.0, constant: 5.0) newConstraint.identifier = "TitleCenterY" newConstraint.isActive = true continue }
運(yùn)行效果:

運(yùn)行效果.gif

下載地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末源哩,一起剝皮案震驚了整個(gè)濱河市馁龟,隨后出現(xiàn)的幾起案子矢炼,更是在濱河造成了極大的恐慌句灌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件格带,死亡現(xiàn)場(chǎng)離奇詭異屈呕,居然都是意外死亡专甩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)岂昭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)攀细。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么浆熔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任邓萨,我火速辦了婚禮,結(jié)果婚禮上歉甚,老公的妹妹穿的比我還像新娘。我一直安慰自己献起,他們只是感情好理肺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著转晰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪未桥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天荷憋,我揣著相機(jī)與錄音,去河邊找鬼实蔽。 笑死局装,一個(gè)胖子當(dāng)著我的面吹牛玫膀,可吹牛的內(nèi)容都是我干的誉简。 我是一名探鬼主播锈津,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼轧邪!你這毒婦竟也來(lái)了刽脖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忌愚,失蹤者是張志新(化名)和其女友劉穎曾棕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菜循,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翘地,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癌幕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衙耕。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勺远,靈堂內(nèi)的尸體忽然破棺而出橙喘,到底是詐尸還是另有隱情,我是刑警寧澤胶逢,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布姥闪,位于F島的核電站,受9級(jí)特大地震影響别威,放射性物質(zhì)發(fā)生泄漏铜幽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一碟刺、第九天 我趴在偏房一處隱蔽的房頂上張望锁保。 院中可真熱鬧,春花似錦、人聲如沸爽柒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浩村。三九已至做葵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間心墅,已是汗流浹背蜂挪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗓化,地道東北人棠涮。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刺覆,于是被迫代替她去往敵國(guó)和親严肪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容