HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 集合查看Cell Circle Loader影响多个单元格和闪烁大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个基本上是书库的视图,我一直在尝试为书籍添加循环加载动画,以便用户在选择新书时可以看到下载进度.我遇到的问题是加载动画在indexPath 0-0的单元格中工作正常,但是当它在任何其他indexPath中时,动画将闪烁并暂时出现在其他单元格上.

在下图中,我正在下载日语,但是装载程序暂时在阿尔巴尼亚语,亚美尼亚语,Cebuano以及此屏幕截图时未捕获的其他几本书中闪烁.因为日本装载机也在闪烁,我拍摄截图的那一刻根本没有显示日本装载机.

经过一些调试后,我发现这很有可能发生,因为每次重新加载视图时,单元格都会被重用,并且由于某种原因,单元格的顺序会被循环.我已经尝试覆盖自定义单元格上的prepareForReuse并将设置重新设置为隐藏,但是我仍然会在一瞬间获得进度幽灵,导致闪烁.

我执行进度指示器的代码非常基本.下面是我的设置功能,它在单元初始化时创建进度条

func setupProgressCircle(){
        progressCircle = CAShapeLayer();

        let centerPoint = CGPoint (x: bookView.bounds.width / 2,y: bookView.bounds.height / 2);
        let circleRadius : CGFloat = bookView.bounds.width / 2 * 0.5;

        var circlePath = UIBezierPath(arcCenter: centerPoint,radius: circleRadius,startAngle: CGFloat(-0.5 * M_PI),endAngle: CGFloat(1.5 * M_PI),clockwise: true    );

        progressCircle = CAShapeLayer ();
        progressCircle!.path = circlePath.CGPath;
        progressCircle!.strokeColor = UIColor.whiteColor().CGColor;
        progressCircle!.fillColor = UIColor.clearColor().CGColor;
        progressCircle!.lineWidth = 5;
        progressCircle!.strokeStart = 0;
        progressCircle!.strokeEnd = 0
        overlayView.layer.addSublayer(progressCirclE);
    }

随着下载进展以增加进度,我从cellForRowATindexPath调用以下函数.

func setProgress(progress: CGFloat){
    progressCircle?.strokeEnd = progress
}

我已经添加了以下函数,以便当单元格被重用或重新排序时,进度将认为无效且无指示.

override func prepareForReuse() {
        if progressCircle != nil{
            progressCircle?.hidden = true
            progressCircle!.strokeEnd = 0
        }
    }

不幸的是,我所尝试的任何事情都没有解决这个问题.目前,每当我获得一本书的进度更新时,我都会调用collectionView.reloadData(),我想知道这是否可能是一个问题.

我愿意重构,我不是专家,很可能会把问题接近错误.我愿意接受建议,并可根据需要进行详细说明.谢谢!

updatE

根据要求,这是我的cellForRowATindexPath的精简版本

func collectionView(collectionView: UICollectionView,cellForItemATindexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReusEIDentifier("CollectionCell",forIndexPath: indexPath) as! LanguageBookCell
    var book = controller.objectATindexPath(indexPath) as! BookData

    ...Cell Text/Image/Config...

    if(book.active == falsE){
        cell.overlayView!.alpha = 0.7
        cell.dlLabel.hidden = false
        cell.dlLabel.text = "Tap to Download"
        cell.progressCircle.hidden = true
    }else if(book.status == "Loading"){
        cell.progressCircle.hidden = false
        cell.setProgress(percentLoaded)
    }
    ... Other Cell Configs...

    return cell
}

解决方法

根据要求,我发布了我能够提出的最佳解决方案.

我无法弄清楚如何强制细胞不重新排序自己,无论我怎么做,每次调用reloadData()时,细胞都会自行重新排序.

然而,当我意识到其他属性也被移动时,例如标题,我能够阻止我的细胞闪烁.

最后,我发现我只是在重新计算改变的单元格上的进度,所以当单元格迁移时,它们不会重置为正确的属性.通过始终将单元格设置重置为我的cellForRowATindexPath中的认值,我能够摆脱闪烁.

对于那些遇到类似问题的人,我最好的建议是仔细检查你的逻辑语句,以确保代码中没有漏洞,如果单元格被重新分配,设置将无法正确重置.祝大家好运!

大佬总结

以上是大佬教程为你收集整理的ios – 集合查看Cell Circle Loader影响多个单元格和闪烁全部内容,希望文章能够帮你解决ios – 集合查看Cell Circle Loader影响多个单元格和闪烁所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。