項(xiàng)目開(kāi)發(fā)需要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的效果洪鸭,一個(gè)音樂(lè)專(zhuān)輯奇颠,需要實(shí)現(xiàn)定時(shí)反復(fù)3D旋轉(zhuǎn)的效果民珍,這個(gè)效果很簡(jiǎn)單襟士,利用iOS自帶的動(dòng)畫(huà)接口對(duì)應(yīng)的Flip動(dòng)畫(huà)即可,效果如下:
開(kāi)發(fā)的時(shí)候用Xib
管理專(zhuān)輯兩個(gè)子View
嚷量,在使用UIView
快速動(dòng)畫(huà)接口
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^ __nullable)(BOOL finished))completion;
和UIViewAnimationOptionTransitionFlipFromLeft
搭配使用的時(shí)候出現(xiàn)第一個(gè)奇怪的問(wèn)題:
動(dòng)畫(huà)執(zhí)行之后在使用UIViewAnimationOptionTransitionFlipFromRight
反轉(zhuǎn)翻轉(zhuǎn)效果出現(xiàn)的情況就是翻轉(zhuǎn)一般View
消失了陋桂,經(jīng)過(guò)調(diào)試后發(fā)現(xiàn),因?yàn)槭鞘褂?code>Xib管理蝶溶,所以Property
聲明是weak
嗜历,就像這樣:
@property (weak, nonatomic) IBOutlet UIView *coverContainer;
所以fromView
對(duì)應(yīng)的子視圖被系統(tǒng)管理在動(dòng)畫(huà)執(zhí)行之后就被釋放掉了,導(dǎo)致動(dòng)畫(huà)反轉(zhuǎn)兩次
之后正反兩個(gè)View
都消失了抖所。
既然是被釋放
的問(wèn)題秸脱,那好解決,聲明的時(shí)候把weak
改成strong
不就好了部蛇,代碼如下:
@property (strong, nonatomic) IBOutlet UIView *coverContainer;
緊接接著出現(xiàn)更踏馬奇怪的問(wèn)題:
這下視圖是沒(méi)有消失,有圖服務(wù)端沒(méi)有裁剪圖片咐蝇,獲取到的封面圖片尺寸很大涯鲁,翻轉(zhuǎn)兩次之后封面圖片把整個(gè)屏幕都占滿了
原始效果:
實(shí)際效果:
這個(gè)問(wèn)題首先第一考慮是不是因?yàn)?code>UIView的快速動(dòng)畫(huà)接口導(dǎo)致
UIImageView
的ContentMode
發(fā)生了改變,調(diào)試之后發(fā)現(xiàn)根本不是有序,所有能預(yù)想的結(jié)果都不符合預(yù)期抹腿,最后實(shí)在沒(méi)辦法只能出動(dòng)神器Reveal
,通過(guò)UI調(diào)試之后發(fā)現(xiàn)fromView
和toView
對(duì)應(yīng)的視圖和SuperView
的約束被破壞了導(dǎo)致旭寿。
找到問(wèn)題所在是約束
的原因警绩,看可以使用原生代碼或者是使用Masonry
等第三方庫(kù)在執(zhí)行動(dòng)畫(huà)之前重建約束都行。
不過(guò)這里無(wú)意中發(fā)現(xiàn)UIViewAnimationOptions
枚舉里有一個(gè)奇怪的選項(xiàng)叫UIViewAnimationOptionShowHideTransitionViews
盅称,感覺(jué)好像有得玩肩祥,果斷把strong
替換會(huì)weak
試了一下:
UIViewAnimationOptions animationOptions = _front ? UIViewAnimationOptionTransitionFlipFromLeft : UIViewAnimationOptionTransitionFlipFromRight;
[UIView transitionFromView:(_front ? _coverContainer : _blurContainer)
toView:(_front ? _blurContainer : _coverContainer)
duration:1.0f
options:(animationOptions | UIViewAnimationOptionShowHideTransitionViews)
completion:nil];