iOS系統(tǒng)中關(guān)于Autolayout約束動(dòng)畫化的解析
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
下面這個(gè)gif就是我們想去實(shí)現(xiàn)的效果。
藍(lán)圖應(yīng)該在右邊滑出,然后黃圖相應(yīng)地充斥整個(gè)屏幕…
設(shè)置基本約束
一開始,我在IB上拖出視圖,拉上約束。這個(gè)時(shí)候倆視圖都是可見的。
黃圖有五個(gè)約束:左邊相對(duì)父視圖間隔,右邊相對(duì)藍(lán)圖間隔,上邊相對(duì)switch間隔,下邊相對(duì)父視圖間隔,以及和藍(lán)圖寬度相等約束。
藍(lán)圖和黃圖的約束差不多,除了藍(lán)圖是右邊相對(duì)父視圖間隔。
非必需約束優(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.
然后我們在給黃圖加一個(gè)它右側(cè)相對(duì)父視圖的約束(就像上面提到的),優(yōu)先級(jí)也搞到750.
把約束拖出來!
為了在運(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%
下載地址
iOS系統(tǒng)中關(guān)于Autolayout約束動(dòng)畫化的解析下載
相關(guān)電子資料下載
- iOS17.1可能明天發(fā)布,iOS17.1主要修復(fù)哪些問題? 380
- 華為全新鴻蒙蓄勢待發(fā) 僅支持鴻蒙內(nèi)核和鴻蒙系統(tǒng)應(yīng)用 719
- 蘋果手機(jī)系統(tǒng)iOS 17遭用戶質(zhì)疑 731
- iPhone12輻射超標(biāo)?蘋果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標(biāo)明年智能手機(jī)出貨7000萬部;消息稱 MiOS 僅限國內(nèi),小米 28208
- 蘋果推送iOS17.0.3,解決iPhone15Pro系列存在機(jī)身過熱 216
- Testin云測兼容和真機(jī)服務(wù)平臺(tái)中上線iPhone 15系列手機(jī) 208
- 利爾達(dá)推出搭載HooRiiOS的Matter模組 145
- 運(yùn)放參數(shù)解析:輸入偏置電流(Ibias)和失調(diào)電流(Ios) 128
- 昆侖太科發(fā)布支持國產(chǎn)飛騰騰銳D2000芯片的開源BIOS固件版本 448