2016-12-19 2 views
1

У меня есть collectionview с полноэкранным cells, и он автоматически прокручивается один за другим. Я хочу добавить анимацию в ячейку 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', он получает вызов до завершения прокрутки. Что вы можете сделать, это вызвать его в обратном вызове UScrollViewDelegate '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

Я думаю, мы должны больше сосредоточиться на решении, а не только на языке. Но все же я переделал свой ответ в Swift .. Спасибо.! –

+0

Благодарим вас за ответ. Когда я пытаюсь это сделать, я получаю ошибку в этой строке. 'cell.alpImage.getBiggerAnim()' Он не позволяет мне получить доступ к alpImage. Я попытался заменить UICollectionViewCell на AlphabetCollectionViewCell, но он не сработал ни – Volkan

+0

. Проверьте мой обновленный ответ. –

Смежные вопросы