2017-08-16 133 views
0

你好,我想動畫一個CollectionView。它需要改變位置x和他的寬度。動畫集合視圖swift

UIView.animate(withDuration: 1, delay: 0, options: .beginFromCurrentState, animations: { 
    collectionView.frame = CGRect(x: 500, y: 0, width: 1000, height: 700) 
}) 

但問題是單元格中的圖像沒有調整大小,我認爲單元格也是如此。 你有解決方案嗎?

回答

0

UICollectionViewCell大小與parrent UICollectionView的框架無關。

也許你實際上可以 「放大」 的圖層上

var transformation = CGAffineTransform.identity 
    let translate = CGAffineTransform(translationX: 2, y: 2) 
    let scale = CGAffineTransform(scaleX: 2, y: 2) 
    transformation = scale.concatenating(translate) 
    UIView.animate(withDuration: 0.15, animations: { 
     self.collectionView.transform = transformation 
    }) 

也許的invalidateLayout通話可以幫助你。 您還在使用自定義流佈局

0
  1. 創建一個簡單的自定義流佈局。
  2. 將此流佈局類指定到故事板中的集合視圖。

    class CustomFlowLayout: UICollectionViewFlowLayout { 
        override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { 
         return true 
        } 
    } 
    

    而且比框架動畫約束更好。要做到這一點:

  3. 使寬度和主要約束的出口。
  4. 在UIView動畫塊中更改它們的常量。
  5. 不要忘記在動畫塊的結尾處調用self.layoutIfNeeded()。
+0

感謝您的幫助,但我有一個問題,現在我有不好的影響時,動畫開始。 單元格內的圖像變寬和變窄。 –

+0

@ jimmy-gonçalves你能提供一些關於你如何建立細胞的更多信息嗎?細胞大小如何變化? –

+0

我把我的實際代碼展示給你看,我的單元格實際上是用UICollectionFlowLayout中的方法設置的,它的大小爲item的大小。 –

0

在視圖控制器,如果使用的是故事板,連接(在我的例子collectionView)使用IBOutlet中,(在我的例子collectionViewWidth)集合視圖寬度約束作爲IBOutlet中和UICollectionView作爲IBOutlet中UICollectionviewFlowLayoutcollectionViewFlowLayout在我的例子) 。可以用下面的同時改變它的集合視圖幀和細胞:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5, execute: { 
    self.width = 400 
    self.height = 400 
    self.collectionView.performBatchUpdates({ 
    self.collectionViewFlowLayout.invalidateLayout() 
    self.collectionView.setCollectionViewLayout(self.collectionViewFlowLayout, animated: true) 
    }, completion: { _ in }) 
}) 

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5, execute: { 
    self.collectionViewWidth.constant = 50 
    UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseOut, 
          animations: self.view.layoutIfNeeded, completion: nil) 
}) 

你需要聲明widthheight VAR與例如100初始值類的屬性。然後在上面的代碼中進行更改。由於下面的實施,它成爲可能。請注意,這需要您採用協議UICollectionViewDelegateFlowLayout

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    return CGSize(width: width, height: height) 
    } 
0

我現在的問題是過渡期間的一個不好的影響。

小區都設置這樣的:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
{ 
    return CGSize(width: collectionView.frame.width, height: collectionView.frame.height) 
} 

而改變的代碼的CollectionView領先的約束:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
{ 
    UIView.animate(withDuration: 1, delay: 0, options: .beginFromCurrentState, animations: { 
      collectionView.collectionViewLayout.invalidateLayout() 
      self.allViewCVLeadingConstraint.constant = 1000 
      self.layoutIfNeeded() 
     }, completion: nil) 
}