Bug演示
從gif中可以看到我們是想實現(xiàn)這樣的效果:
tableViewCell上有圖片脱拼,有文字萎馅、價格等拼窥,但是我們現(xiàn)在關(guān)心的是圖片加載出現(xiàn)時的效果,就是那個圖片漸現(xiàn)的動畫裆泳。
我們先來實現(xiàn)這個動畫效果叹洲,當(dāng)然我這里用的是SDWebImage框架來加載網(wǎng)絡(luò)圖片,然后在SD框架中的UIImageView+WebCache.m這個分類的源碼里面的這個方法中進行修改:
wself.image = image;
wself.alpha =0.0f;
[UIView transitionWithView:wself duration:0.5 options:UIViewAnimationOptionCurveEaseIn animations:^{
wself.alpha =1.0f;
}];
[wself setNeedsLayout];
或者
wself.image = image;
wself.alpha =0.0f;
[UIView animateWithDuration:0.5 animations:^{
wself.alpha = 1.0f;
}];
[wself setNeedsLayout];
于是這樣就會出現(xiàn)如上gif所示的bug了运提,主線程卡頓,造成tableView滑動不流暢闻葵,不跟手民泵,如果不注意的話也許不會發(fā)現(xiàn),但是app使用久了笙隙,一定會有注意到這樣的問題洪灯,十分影響用戶的體驗,有強迫癥的更是分分鐘想要卸載??竟痰。
作為一個注重用戶體驗的碼農(nóng)來說签钩,這種問題怎么能忍呢?所以我經(jīng)過分析終于找到解決方案坏快。
先來說說造成問題的原因吧铅檩。
問題分析
- UIView的動畫屬于transition動畫,transition動畫會另開一個動畫線程莽鸿,然后在主線程中執(zhí)行昧旨,如果此時進行UI操作,會打斷動畫的執(zhí)行祥得,比如tableView的reloadData兔沃,會讓動畫卡頓。詳見這篇文章级及;
- 而Core Animation系列是單獨開辟的線程執(zhí)行動畫乒疏,所以并不會影響主線程的UI響應(yīng)。
解決方案
既然問題找到了饮焦,那么解決起來就簡單了怕吴。
貼上修改后的代碼:
CABasicAnimation *alphaAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
alphaAnimation.fromValue = @0.0f;
alphaAnimation.toValue = @1.0f;
alphaAnimation.duration = 0.5f;
alphaAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
[wself.layer addAnimation:alphaAnimation forKey:@""];
[wself setNeedsLayout];
解決后效果
是不是順暢多了呢?當(dāng)然本人也可能有很多寫錯的地方县踢,只是為出現(xiàn)遇到同樣問題的iOS開發(fā)者提供一種解決方案转绷,歡迎指正和知識點糾正!