自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Autolayout約束動畫化(賣什么萌?。?/h1>

移動開發(fā)
在沒有autoLayout之前,如果你想移動一個view,frame就會派出他兩個小弟origin或者size來對你大喊@"你動我下試試!"。當(dāng)然,frame、bounds和center都是UIView的屬性,所以當(dāng)你真的動了他們,UIView是不會作罷甘休的。所以你知道為啥用戶能看到一系列的動畫了吧,UIView想削你呢。


記于二零一五年晚春:距上次發(fā)文已有五天,看了眾同僚的反饋,我把這段代碼重新搞了搞,以此來避免在運行時添加或刪除約束。取代這些像JAVA一樣笨重的方法的是我開始動態(tài)的改變黃色和藍色視圖約束的優(yōu)先級。超級簡單,超級高效。

在沒有autoLayout之前,如果你想移動一個view,frame就會派出他兩個小弟origin或者size來對你大喊@"你動我下試試!"。當(dāng)然,frame、bounds和center都是UIView的屬性,所以當(dāng)你真的動了他們,UIView是不會作罷甘休的。所以你知道為啥用戶能看到一系列的動畫了吧,UIView想削你呢。

如果你開始用autoLayout了,很快你就發(fā)現(xiàn)你不用親手去處理frame(或者bounds或者center)了。你可以叫約束去搞他。這篇文章就是通過一個簡單的栗子,來告訴你怎么用約束搞點事情出來。額,確切的說是搞出一個簡單的動畫效果。

挑戰(zhàn)

為了簡單明了,我們只用兩個視圖。一個黃色視圖(以下簡稱黃圖)和一個藍色視圖(以下簡稱藍圖)。在"普通"模式下,我們只看到黃圖。在"五彩繽紛"模式下,藍色和黃色視圖都能看到。

視圖…

"喂!為什么都只看到黃圖?。?quot;

"明明只有兩種顏色叫五彩繽紛什么的真的好嗎!"

"你倒是留個種子??!"

啊,不好意思,光注意黃圖了。在"五彩繽紛"模式下,我們看到黃圖和藍圖兩個。這倆視圖應(yīng)該填滿整個屏幕,除了設(shè)備的邊邊以及switch占據(jù)的框框。下面這個gif就是我們想去實現(xiàn)的效果。

藍圖應(yīng)該在右邊滑出,然后黃圖相應(yīng)地充斥整個屏幕…

設(shè)置基本約束

一開始,我在IB上拖出視圖,拉上約束。這個時候倆視圖都是可見的。

黃圖有五個約束:左邊相對父視圖間隔,右邊相對藍圖間隔,上邊相對switch間隔,下邊相對父視圖間隔,以及和藍圖寬度相等約束。

藍圖和黃圖的約束差不多,除了藍圖是右邊相對父視圖間隔。

非必需約束優(yōu)先級

在只有黃圖可見的時候(真是不錯),我們需要加另一個約束,也就是它右側(cè)相對父視圖的間隔約束。如果在上面我加上這個約束,那么他就和那個"右側(cè)相對藍圖約束"沖突了,因為他倆同時有優(yōu)先級1000。為了避免沖突以及移動藍圖,我們可以改變一下黃藍圖間隔的那個約束的優(yōu)先級。

必需約束優(yōu)先級是這個UILayoutPriorityRequired(1000),你不能在運行時改變一個必需約束的優(yōu)先級。優(yōu)先級比UILayoutPriorityRequired小的,就是一個可選或者非必需的約束,類似這種,只要你別把優(yōu)先級設(shè)置為UILayoutPriorityRequired,你就可以改。

所以首先,我們把藍圖右側(cè)相對父視圖約束的優(yōu)先級搞低一點,搞到750.

然后我們在給黃圖加一個它右側(cè)相對父視圖的約束(就像上面提到的),優(yōu)先級也搞到750.

把約束拖出來!

為了在運行時改變藍圖右側(cè)約束我們得先把這個約束拖到代碼中。你也可以像這樣拖任意的約束出來。(就像把控件關(guān)聯(lián)到代碼中一樣,選中約束,按Ctrl拖)

  1. @property (weak, nonatomic) IBOutlet NSLayoutConstraint *blueViewConstraint; 

為了確保我們把藍圖推出屏幕,我們也得調(diào)整黃圖和藍圖中間的間隔約束,所以我們把這個約束也整到代碼中。

  1. @property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewSpacingContraint; 

更新約束

  1. - (void)updateConstraintsForMode { 
  2.   if (self.modeSwitch.isOn) { 
  3.     self.viewSpacingContraint.constant = 8.0
  4.     self.blueViewConstraint.priority = UILayoutPriorityDefaultHigh+1
  5.   } else { 
  6.     self.viewSpacingContraint.constant = self.view.frame.size.width; 
  7.     self.blueViewConstraint.priority = UILayoutPriorityDefaultHigh-1
  8.   } 

現(xiàn)在可以很容易的寫一個方法來根據(jù)模式開關(guān)設(shè)置藍圖約束想要的優(yōu)先級。

我們在storyboard中把黃圖右側(cè)相對父視圖的約束也設(shè)定了優(yōu)先級UILayoutPriorityDefaultHigh(750)。為了使藍圖可見,我們需要把藍圖的右側(cè)約束優(yōu)先級設(shè)定的比750高一些,而隱藏起藍圖時我們得把它設(shè)定的低一些。

請注意!看黑板!我們要給黃藍圖的間隔設(shè)定一個大點的值(我這里用的屏幕寬度)以確保藍圖推出右側(cè)邊界。

我們在視圖第一次加載時也應(yīng)該配置下約束。厚此薄彼可不好。

  1. - (void)viewDidLoad { 
  2.   // ... 
  3.   [self updateConstraintsForMode]; 

動起來!

現(xiàn)在萬事俱備只欠東風(fēng)了,我們現(xiàn)在只需要輕輕的撥動一下模式開關(guān),咦?輕輕的,咦?啊不好意思,忘記把開關(guān)的事件代碼寫上了- -,蘋果的Auto Layout Guide描述了autoLayout搞動畫的基本方法,推薦的代碼如下:

  1. [containerView layoutIfNeeded]; 
  2. [UIView animateWithDuration:1.0 animations:^{ 
  3.   // Make all constraint changes here 
  4.   [containerView layoutIfNeeded]; 
  5. }]; 

這兩個對layoutIfNeeded的調(diào)用強迫將要執(zhí)行的操作完成,然后在動畫塊里捕獲frame的改變。

(譯者補充:想起知乎里一個回答  你在公司項目里面看到過哪些操蛋的代碼?)

  1. if (m_doc->isModified() == true
  2.     for (int i = 0; i < 100; i++) 
  3.     { 
  4.         save(); //Save the document for 100 times to ensure it has been saved successfully. 
  5.     } 

在我們的栗子中用上面的方法,就是這樣式的:

  1. - (IBAction)enableMode:(UISwitch *)sender { 
  2.   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
  3.   [defaults setBool:sender.isOn forKey:modeUserDefaultKey]; 
  4.   [defaults synchronize]; 
  5.     
  6.   [self.view layoutIfNeeded]; 
  7.   [UIView animateWithDuration:1.0 animations:^{ 
  8.     [self updateConstraintsForMode]; 
  9.     [self.view layoutIfNeeded]; 
  10.   }]; 

總結(jié)

代碼在這,點我點我。

責(zé)任編輯:倪明 來源: CocoaChina翻譯活動
相關(guān)推薦

2017-02-07 11:35:26

Android動畫蠟燭動畫

2014-10-10 10:13:52

91助手

2013-04-01 11:29:21

思科軟件化SDN

2010-08-16 13:26:26

云計算運營商

2015-07-08 15:56:47

限挑戰(zhàn)表

2017-05-02 09:51:39

QQ空間

2010-06-04 10:45:07

win7Ubuntu代言人

2012-06-27 10:26:19

Surface

2020-04-29 09:39:22

蘋果谷歌手機

2021-06-01 17:03:03

辦公

2019-11-07 21:51:18

閉包前端函數(shù)

2017-02-24 12:00:35

iOS代碼AutoLayout

2020-09-23 16:05:42

Python手繪圖表編程語言

2014-09-10 16:08:53

蘋果發(fā)布會iPhone6

2010-11-12 15:04:30

SQL Server缺

2017-07-03 15:20:57

智慧城市物聯(lián)網(wǎng)碎片化

2021-12-23 23:04:54

手機蘋果國產(chǎn)

2009-12-21 15:53:29

2020-08-28 10:11:33

蘋果配件手機

2012-09-28 11:29:35

創(chuàng)業(yè)GooglePageRank
點贊
收藏

51CTO技術(shù)棧公眾號