2016-12-19 25 views
1

collectionviewとフルスクリーンcellsがあり、自動的に1つずつスクロールします。私は自分の細胞内のimageViewにアニメーションを追加したいと思います。しかし、自動スクロールの終了後にアニメーションを開始したい。私は以下のコードを試してみましたが、最初のセルでのみ動作します。画像が表示された後、コレクションビューのセル内でアニメーションを表示

私はこの行のアニメーション機能をcell.alpImage.getBiggerAnim()と呼んでいます。しかし私が前に言ったように、それは最初の細胞のためだけに働く。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! AlphabetCollectionViewCell 

    if (indexPath.item >= alpImageArray.count - 1) { 
     cell.alpImage.isHidden = true 
     cell.startAgain.isHidden = false 
     cell.readyLabel.isHidden = true 
     cell.startAgain.addTarget(self, action: #selector(startAgainPressed), for: .touchUpInside) 
    } else if (indexPath.item == 0) { 
     cell.readyLabel.isHidden = false 
     cell.alpImage.isHidden = true 
    } else { 
     cell.startAgain.isHidden = true 
     cell.readyLabel.isHidden = true 
     cell.alpImage.isHidden = false 
     cell.alpImage.image = UIImage(named: alpImageArray[indexPath.row] + ".png") 
    } 
    cell.alpImage.getBiggerAnim() 
    return cell 
} 

これらは、自動スクロールを管理して機能している:

func scrollToNextCell(){ 
    let cellSize = CGSize(width: self.view.frame.width, height: self.view.frame.height) 
    let contentOffset = myCollectionView.contentOffset 
    width: cellSize.width, height: cellSize.height), animated: true) 
    alphabetSoundPlay() 
} 
var myTimer: Timer? 
func startTimer() { 
    myTimer = Timer.scheduledTimer(timeInterval: 3.0, 
            target: self, 
            selector: #selector(scrollToNextCell), 
            userInfo: nil, 
            repeats: true) 
} 

これは私のアニメーションの拡張である:

extension UIView { 
    func getBiggerAnim() { 
     UIView.animate(withDuration: 0.6 , animations: { 
      self.transform = CGAffineTransform(scaleX: 0.6, y: 0.6) 
     },completion: { finish in 
      UIView.animate(withDuration: 0.6){ 
       self.transform = CGAffineTransform.identity 
      } 
     }) 
    } 
} 
+2

あなたは 'celでアニメーションメソッドを呼び出すべきではありませんlForItem'を呼び出すと、スクロールが終了する前に呼び出されます。 UIScrollViewDelegateの 'scrollViewDidEndDecelerating'コールバックで呼び出すことができます。あなたはどのセルが見えているかを知る必要があります。 – ovejka

+0

メインスレッドで 'getBiggerAnim'を呼び出そうとしましたか? –

答えて

0

あなたはこのようなものを使用する必要があります。..

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    for cell: UICollectionViewCell in self.myCollectionView.visibleCells { 
    var indexPath = self.myCollectionView.indexPath(for: cell)! 
    let acell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! AlphabetCollectionViewCell 

    print("\(indexPath)") 
    acell.alpImage.getBiggerAnim() 
    } 
} 
+0

私は、言語だけではなく、ソリューションにもっと焦点を当てるべきだと思います。しかし、私はスウィフトで答えを変えました。ありがとう! –

+0

あなたの答えをありがとう。私はこれを試してみると、私はこの行にエラーが発生します。 'cell.alpImage.getBiggerAnim()'それは 'alpImage'にアクセスさせません。私はUICollectionViewCellをAlphabetCollectionViewCellに置き換えようとしましたが、どちらも動作しませんでした – Volkan

+0

私の更新された答えを確認してください。 –

関連する問題