在CollectionViewCell中上移标签动画

时间:2017-08-09 11:28:50

标签: ios swift animation uicollectionview

我横向滚动CollectionView,其中包含未知数量的单元格,除导航条外,整个屏幕都是如此。而CollectionViewCell则占据整个CollectionView。此外,在这个单元格中,我将UIView集中在一些标签和一个按钮内。这就是我的用户界面的样子:click

每当用户点击此UIView内的按钮时,标签会向上移动一点,并且所有其他标签也会变得可见。如果此模式已被激活,则按钮的工作方式相反:

class WordCell: UICollectionViewCell {

    var isActive = false
@IBOutlet weak var word: UILabel!
    @IBOutlet weak var translation: UILabel!
    @IBOutlet weak var exOne: UILabel!
    @IBOutlet weak var exTwo: UILabel!

// ...

@IBAction func move(_ sender: UIButton) {
        if !isActive {
        UIView.animate(withDuration: 0.25, animations: {
            self.word.frame.origin.y -= self.bounds.height / 7
        }, completion: nil)
            UIView.animate(withDuration: 0.3, animations: {
                self.translation.alpha = 1
                self.exOne.alpha = 1
                self.exTwo.alpha = 1
            })
            isActive = true
        } else {
            UIView.animate(withDuration: 0.25, animations: {
                self.word.frame.origin.y += self.bounds.height / 7
            }, completion: nil)
            UIView.animate(withDuration: 0.3, animations: {
                self.translation.alpha = 0
                self.exOne.alpha = 0
                self.exTwo.alpha = 0
            })
        isActive = false
        }
    }
}

然后我的用户界面如下:click

我的CollectionView代码:

    // CollectiomView Delegate stuff, in the code above I just retrieve data from FireBase
extension RepeatController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return words.count
        }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "wordCell", for: indexPath) as! WordCell
        if words[0].lPairs == "re" {
            cell.word.text = words[indexPath.row].translation
            cell.translation.text = words[indexPath.row].word

        } else {
            cell.word.text = words[indexPath.row].word
            cell.translation.text = words[indexPath.row].translation
        }
        cell.exOne.text = words[indexPath.row].exOne
        cell.exTwo.text = words[indexPath.row].exTwo
        return cell
    }

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

}

问题:

此系统仅在我单击按钮两次时起作用(向上移动标签然后将其返回到相同位置并隐藏所有其他标签)。否则,在2-3个单元格之后,所有其他标签变得可见,主标签位于顶部,就像我在每个单元格的按钮上键入的那样(但我没有)。问题是什么?

1 个答案:

答案 0 :(得分:0)

由于更改是在UI中,所以首先我认为您应该首先将动画代码放在DispatchQueue.main.async块中

然后,由于您使用的是可重用的集合视图单元格,因此您在动画代码中更改的值对于重用的单元格保持相同,因此要在集合视图重用它们之前为这些值赋予一些初始值,我们会覆盖{{1方法并在那里给出初始值。

使用文档here

中的想法
  

当视图出列以供使用时,此方法在之前调用   相应的dequeue方法将视图返回给您的代码。子类   可以覆盖此方法并使用它来重置属性   默认值,通常使视图可以再次使用

在代码中,您可以这样做:

prepareForReuse()