ios – 集合查看Cell Circle Loader影响多个单元格和闪烁

ios – 集合查看Cell Circle Loader影响多个单元格和闪烁,第1张

概述我有一个基本上是书库的视图,我一直在尝试为书籍添加循环加载动画,以便用户在选择新书时可以看到下载进度.我遇到的问题是加载动画在indexPath 0-0的单元格中工作正常,但是当它在任何其他indexPath中时,动画将闪烁并暂时出现在其他单元格上. 在下图中,我正在下载日语,但是装载程序暂时在阿尔巴尼亚语,亚美尼亚语,Cebuano以及此屏幕截图时未捕获的其他几本书中闪烁.因为日本装载机也在闪烁 我有一个基本上是书库的视图,我一直在尝试为书籍添加循环加载动画,以便用户在选择新书时可以看到下载进度.我遇到的问题是加载动画在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影响多个单元格和闪烁所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1026038.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存