一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>通訊/手機(jī)編程>

iOS系統(tǒng)中關(guān)于Autolayout約束動(dòng)畫化的解析

大?。?/span>0.3 MB 人氣: 2017-09-26 需要積分:1

  下面這個(gè)gif就是我們想去實(shí)現(xiàn)的效果。

  iOS系統(tǒng)中關(guān)于Autolayout約束動(dòng)畫化的解析

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

  設(shè)置基本約束

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

  iOS系統(tǒng)中關(guān)于Autolayout約束動(dòng)畫化的解析

  黃圖有五個(gè)約束:左邊相對(duì)父視圖間隔,右邊相對(duì)藍(lán)圖間隔,上邊相對(duì)switch間隔,下邊相對(duì)父視圖間隔,以及和藍(lán)圖寬度相等約束。

  iOS系統(tǒng)中關(guān)于Autolayout約束動(dòng)畫化的解析

  藍(lán)圖和黃圖的約束差不多,除了藍(lán)圖是右邊相對(duì)父視圖間隔。

  iOS系統(tǒng)中關(guān)于Autolayout約束動(dòng)畫化的解析

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

  在只有黃圖可見的時(shí)候(真是不錯(cuò)),我們需要加另一個(gè)約束,也就是它右側(cè)相對(duì)父視圖的間隔約束。如果在上面我加上這個(gè)約束,那么他就和那個(gè)“右側(cè)相對(duì)藍(lán)圖約束”沖突了,因?yàn)樗麄z同時(shí)有優(yōu)先級(jí)1000。為了避免沖突以及移動(dòng)藍(lán)圖,我們可以改變一下黃藍(lán)圖間隔的那個(gè)約束的優(yōu)先級(jí)。

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

  所以首先,我們把藍(lán)圖右側(cè)相對(duì)父視圖約束的優(yōu)先級(jí)搞低一點(diǎn),搞到750.

  iOS系統(tǒng)中關(guān)于Autolayout約束動(dòng)畫化的解析

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

  iOS系統(tǒng)中關(guān)于Autolayout約束動(dòng)畫化的解析

  把約束拖出來!

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

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

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

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

  更新約束

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

  - (void)updateConstraintsForMode { if (self.modeSwitch.isOn) { self.viewSpacingContraint.constant = 8.0; self.blueViewConstraint.priority = UILayoutPriorityDefaultHigh+1; } else { self.viewSpacingContraint.constant = self.view.frame.size.width; self.blueViewConstraint.priority = UILayoutPriorityDefaultHigh-1; } }

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

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

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

  - (void)viewDidLoad { // 。。. [self updateConstraintsForMode]; }

  動(dòng)起來!

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

 ?。踓ontainerView layoutIfNeeded]; [UIView animateWithDuration:1.0 animations:^{ // Make all constraint changes here [containerView layoutIfNeeded]; }];

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

 ?。ㄗg者補(bǔ)充:想起知乎里一個(gè)回答 你在公司項(xiàng)目里面看到過哪些操蛋的代碼?)

  if (m_doc-》isModified() == true) { for (int i = 0; i 《 100; i++) { save(); //Save the document for 100 times to ensure it has been saved successfully. } }

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

  - (IBAction)enableMode:(UISwitch *)sender { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setBool:sender.isOn forKey:modeUserDefaultKey]; [defaults synchronize]; [self.view layoutIfNeeded]; [UIView animateWithDuration:1.0 animations:^{ [self updateConstraintsForMode]; [self.view layoutIfNeeded]; }]; }

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?