利用UICollectionViewFlowLayout的隱式動畫實現UICollectionView的layout的動畫調整(外加放大指定cell效果),collectionviewlayout

來源:互聯網
上載者:User

利用UICollectionViewFlowLayout的隱式動畫實現UICollectionView的layout的動畫調整(外加放大指定cell效果),collectionviewlayout

前幾天在gitHub看到個不錯的效果,就是 DaiExpandCollectionView,效果 所以趕緊下下來源碼看看他怎麼實現的,開啟源碼看了半天,發現他沒寫什麼關於動畫的代碼啊。。。經高人指點,才明白原來他是利用了UICollectionViewFlowLayout的隱式動畫! 所謂隱式動畫,就是系統內建的動畫了,其實也不是什麼高大上的東西,關鍵是我怎麼就沒想到可以這麼用! 研究了半天人家的源碼,基本瞭解了他實現的思路,然後發現他的這個庫用起來比較不方便,需要繼承他的collectionView,而且不能自訂cell大小,不能很好的適配各種尺寸的螢幕,但這個庫我確實很喜歡,所以就自己仿寫了一個,就是LXMExpandLayout,順便解決下上面發現的問題,地址在這裡: https://github.com/Phelthas/LXMExpandLayout效果                    還是來說說思路和原理的問題基本思路是:     繼承系統的UICollectionViewFlowLayout,利用UICollectionViewFlowLayout已有的各種屬性和效果,對其做出適當的修改已達到自己想要的效果 具體來說就是:1,重載  - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect;方法,用 [super layoutAttributesForElementsInRect:newRect]擷取各個元素在 UICollectionViewFlowLayout中的layoutAttributes。然後修改其屬性 2,屬性可不是隨便改的,這個得給原作者點個贊,他想出來的這個規則,讓這個屬性的修改簡單了好幾倍。這個規則就是:選中的item放大到這個item的旁邊只能放得下一個沒有放大的item!!!這個規則的牛X之處在於:這樣放大的item的右邊,剛好可以放得下原來跟他同一行的剩下的item,進而需要修改屬性的item就是原來跟需要放大的item同一行的item,剩下item,只需要簡單的上下平移或者根本不用動!!! 3,知道了這個規則,就有了方向,可以大膽動手改了,選中的item用transform屬性做平移和放大,其他的簡單修改frame就可以了這裡怎麼取出來和選中item同一行的其他item呢?有個不錯的方法,就是: self.sameRowItemArray = [super layoutAttributesForElementsInRect:CGRectMake(0, selectedAttributes.frame.origin.y, self.collectionViewWidth, self.itemHeight)];注意是super的方法,不是self~~ 4,關鍵的時刻到了,怎麼讓collectionView執行隱形動畫呢?這個也是從原作者那裡學到的,就是調用系統的 - (void)performBatchUpdates:(void (^)(void))updates completion:(void (^)(BOOL finished))completion;方法。我把它封裝成了一個collectionView的分類,方便配合我的LXMExpandLayout使用。這個方法會使collectionView重新調用其layout去重新布局,而且是帶動畫的哦~~ 5,直接調用performBatchUpdates方法的話,動畫是線性,那怎麼樣才能有彈簧的效果呢?這裡又從原作者那裡學到一招:用一個UIView animation的block將則個performBatchUpdates包起來這樣就可以用UIView的animation動畫代替performBatchUpdates的預設動畫。利用iOS7內建的彈簧動畫方法+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);效果杠杠的~~ 6,發現個UICollectionView的系統bug,關於UICollectionViewFlowLayout的UICollectionViewFlowLayout 的 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 方法返回的數組中有indexpath重複的對象,解決辦法見:http://stackoverflow.com/questions/12927027/uicollectionview-flowlayout-not-wrapping-cells-correctly-ios/13389461#13389461   其他還有一些細節需要注意的,代碼裡我已經寫了注釋了,這裡就不在說了具體這個庫怎麼使用,也已經寫在gitHub上了,也就不羅嗦了。有問題歡迎留言討論~~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.