使用每个 collectionView 单元格点击创建的新视图,而不是更新现有视图 [英] new view created with every collectionView cell tap instead of updating the existing one

查看:20
本文介绍了使用每个 collectionView 单元格点击创建的新视图,而不是更新现有视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在 collectionView Cells 中拥有

这就是我点击左下角第 1 次时的样子:

我可以通过动画看到,第二个环以相同的进度覆盖在左下角的第一个环上.不知怎的,其他戒指也发生了变化……为什么?您甚至可以在其他一些圆圈上看到第二个环.您还可以看到红色的阴影变暗了一点.当我多次点击时,一切都变得完全(密集)红色.

感谢您的帮助!

解决方案

您可以使用模式 ma​​rk &配置

在方法 didSelectItemAt 中,更新数据

在方法cellForItemAt中,更新UI,使用 myCollectionView.reloadData()触发

 var progressData = [IndexPath: Double]()覆盖 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) ->UICollectionViewCell {let cell = collectionView.dequeueReusableCell(withReuseIdentifier:reuseIdentifier, for:indexPath) as!myCollectionViewCell如果让 val = progressData[indexPath]{cell.setProgress(进度:val)}别的{var 值 = 双精度 (0)if(indexPath.item != 0){值 = 1/双(indexPath.item)}progressData[indexPath] = 值cell.setProgress(进度:值)}返回单元格}覆盖 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {进度数据[索引路径]!+= 0.1myCollectionView.reloadData()}

I want to have this ring progress view (cocoa pod) inside collectionView Cells. When you tap on a cell, the progress should increase by 0.1 (0.0 = 0% Progress, 1.0 = 100% progress).

Unfortunately, it seems like it always creates a new progress view above the old one, because the shade of red is getting darker and you can see a second/third/.. ring. I have no idea how I can fix this.

This is my code: (Cell class and CollectionViewController Class)

    import UIKit

private let reuseIdentifier = "Cell"

class myCollectionViewController: UICollectionViewController {

    @IBOutlet var myCollectionView: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        myCollectionView.reloadData()
    }

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }


    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 7
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! myCollectionViewCell
    
        if(indexPath.item != 0){
            cell.setProgress(progress: 1 / Double(indexPath.item))
        }
        return cell
    }
    
    override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! myCollectionViewCell
        cell.setProgress(progress: cell.getProgress() + 0.1)
        myCollectionView.reloadData()
    }
}



import UIKit
import MKRingProgressView

class myCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var ringView: UIView!
    let ringsize = 150
    var ringProgressView = RingProgressView()
    override func layoutSubviews() {
         ringProgressView = RingProgressView(frame: CGRect(x: 0, y: 0, width: ringsize, height: ringsize))
        ringProgressView.startColor = .red
        ringProgressView.endColor = .magenta
        ringProgressView.ringWidth = CGFloat(ringsize) * 0.15
        ringProgressView.progress = 0.0
        ringProgressView.shadowOpacity = 0.5
        ringView.addSubview(ringProgressView)
    }
}

extension myCollectionViewCell{
    func setProgress(progress: Double){
        UIView.animate(withDuration: 0.5){
            self.ringProgressView.progress = progress
        }
    }
    func getProgress() -> Double{
        return self.ringProgressView.progress
    }
}

This is what it looks like when launch (the progress it for testing at (1/indexpath.item):

And this is what it looks like when I TAP THE BOTTOM LEFT CICLE 1 TIME:

I can see with the animation, that a second ring overlays the first ring on the bottom left circle with same progress. Somehow the other rings also changed... why? You can even see the second ring on some other circles. You can also see that the shade of the red went a little bit darker. When I tap multiple times, everything becomes completely (intensive) red.

Thanks for any help!

解决方案

You can use pattern mark & config

in method didSelectItemAt , update the data

in method cellForItemAt , update the UI, use myCollectionView.reloadData() to trigger

  var progressData = [IndexPath: Double]()

  override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! myCollectionViewCell
    
        
        if let val = progressData[indexPath]{
             cell.setProgress(progress: val)
        }
        else{
             var value = Double(0)
             if(indexPath.item != 0){
                 value = 1 / Double(indexPath.item)
             }
             
             progressData[indexPath] = value
             cell.setProgress(progress: value)
        }
        
        return cell
    }
    
    override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        progressData[indexPath]! += 0.1
        myCollectionView.reloadData()
    }

这篇关于使用每个 collectionView 单元格点击创建的新视图,而不是更新现有视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆