masonry 和基礎(chǔ)動(dòng)畫(huà)的問(wèn)題

找到masonry結(jié)合view animation要這樣處理的原因了,參考文章在此:
http://www.itdecent.cn/p/eb2c4bb4e3f1

學(xué)習(xí)的深度還是需要自己去堅(jiān)持!


(1)情景:

自定義一個(gè)類(lèi)似如下的組件:

屏幕快照 2017-08-07 下午5.38.12.png

效果要類(lèi)似原生action sheet的動(dòng)效,支持?jǐn)?shù)據(jù)源構(gòu)建對(duì)應(yīng)ui,同時(shí)要有交互的輸出。

(2)問(wèn)題

構(gòu)建途中,仍然習(xí)慣使用masonry布局,思路是先根據(jù)數(shù)據(jù)源構(gòu)建對(duì)應(yīng)ui,待用戶(hù)觸發(fā)出現(xiàn)交互時(shí)彈出ui。
我這里首先將構(gòu)建的ui置于屏幕外底部,alpha = 0,觸發(fā)交互后,利用基礎(chǔ)動(dòng)畫(huà)形成彈出效果。但是這種直接構(gòu)建UI,然后在使用基礎(chǔ)動(dòng)畫(huà)彈出的效果是錯(cuò)亂的,排除約束等位置信息可能的錯(cuò)誤之后,決定用frame實(shí)現(xiàn),frame果然沒(méi)有問(wèn)題。

(3)解決

參考網(wǎng)上資料,各種方法中,有的說(shuō)要使用

[view.superView  layoutIfNeeded];

重新設(shè)置layout屬性時(shí),應(yīng)該調(diào)這個(gè)方法。但是我是調(diào)用基礎(chǔ)動(dòng)畫(huà),block中進(jìn)行masonry的remake,按理說(shuō)是可以進(jìn)行約束更新的,不需要layoutIfNeeded,這是疑問(wèn)1.
按照網(wǎng)上說(shuō)法重新設(shè)置之后還是有錯(cuò)亂現(xiàn)象,然后又找資料,說(shuō)是需要延遲處理,最后在調(diào)用動(dòng)畫(huà)出現(xiàn)的方法前加了一段小時(shí)間的延遲,masonry 的remake在延遲方法中, layoutIfNeeded在基礎(chǔ)動(dòng)畫(huà)的block中達(dá)到了預(yù)期效果。

//更新約束
[self.cancelButton mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self).offset(15 * WidthScale);
        make.right.equalTo(self).offset(- 15 * WidthScale);
        make.height.mas_equalTo(44 * HEIGHT_SCALE);
        make.bottom.equalTo(self).offset(- 15 * HEIGHT_SCALE);
    }];
   
 //使約束動(dòng)畫(huà)效果出現(xiàn)
    [UIView animateWithDuration:0.25 animations:^{ 
        [self.cancelButton.superview layoutIfNeeded];
    }];
(4)思考

考慮到masonry的約束添加和更改與基礎(chǔ)動(dòng)畫(huà)的動(dòng)畫(huà)實(shí)現(xiàn)都是在block中完成的,所以不會(huì)立即執(zhí)行的。當(dāng)?shù)谝淮芜M(jìn)行約束后,直接不延遲掉更改的約束動(dòng)畫(huà),就很容易造成約束未定動(dòng)畫(huà)開(kāi)始的現(xiàn)象。所以需要延遲執(zhí)行;約束更改的語(yǔ)句是放在基礎(chǔ)動(dòng)畫(huà)block之外的,block中只有l(wèi)ayoutIfNeeded進(jìn)行控件約束更新,這一點(diǎn)也是由于masonry的更新約束在block中而采用的方法,layoutIfNeeded相當(dāng)于直接順序執(zhí)行改變約束了(我的思考)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容