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
}
})
}
}
あなたは 'celでアニメーションメソッドを呼び出すべきではありませんlForItem'を呼び出すと、スクロールが終了する前に呼び出されます。 UIScrollViewDelegateの 'scrollViewDidEndDecelerating'コールバックで呼び出すことができます。あなたはどのセルが見えているかを知る必要があります。 – ovejka
メインスレッドで 'getBiggerAnim'を呼び出そうとしましたか? –