Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 集合视图单元格循环加载程序影响多个单元格并闪烁_Ios_Swift_Uiviewanimation_Collectionview - Fatal编程技术网

Ios 集合视图单元格循环加载程序影响多个单元格并闪烁

Ios 集合视图单元格循环加载程序影响多个单元格并闪烁,ios,swift,uiviewanimation,collectionview,Ios,Swift,Uiviewanimation,Collectionview,我有一个基本上是图书库的视图,我一直在尝试向图书添加循环加载动画,以便用户在选择新书时可以看到下载进度。我遇到的问题是,加载动画在indexPath 0-0的单元格中工作正常,但在任何其他indexPath中加载动画时,动画将闪烁并在其他单元格中短暂出现 在下图中,我正在下载日语,但加载程序会在阿尔巴尼亚语、亚美尼亚语、塞布阿诺语和其他一些在截图时未捕获的书籍上暂时闪烁。因为日文加载器也在闪烁,所以我截图的那一刻根本没有显示日文加载器 经过一些调试后,我发现这很可能发生,因为每次重新加载视图时

我有一个基本上是图书库的视图,我一直在尝试向图书添加循环加载动画,以便用户在选择新书时可以看到下载进度。我遇到的问题是,加载动画在indexPath 0-0的单元格中工作正常,但在任何其他indexPath中加载动画时,动画将闪烁并在其他单元格中短暂出现

在下图中,我正在下载日语,但加载程序会在阿尔巴尼亚语、亚美尼亚语、塞布阿诺语和其他一些在截图时未捕获的书籍上暂时闪烁。因为日文加载器也在闪烁,所以我截图的那一刻根本没有显示日文加载器

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

我做进度指示器的代码非常基本。下面是我的设置函数,它在单元格初始化时创建进度条

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()
,我想知道这是否是问题的一部分

我对重构持开放态度,我不是专家,很可能在处理问题时出错了。我愿意接受建议,可以根据需要详细说明。谢谢

更新

根据要求,这里是我的CellForRowatineXpath的压缩版本

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()
,单元格都会重新排序

然而,当我意识到其他属性也在移动时,比如标题,我能够阻止我的手机闪烁

最后,我发现我只是在重新计算更改的单元格的进度,所以当单元格迁移时,它们不会重置为正确的属性。通过始终将单元格设置重置为my
cellForRowAtIndexPath
中的默认设置,我能够消除闪烁


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

查看您的CellForRowatineXpath方法会很有帮助。我从我的CellForRowatineXpath添加了相关信息@rdelmar@Unome现在我面临着同样的问题,但没有解决方案:(你解决了这个问题吗?@Rawan这个问题源于这样一个事实,即重新加载集合视图会在不正确重置单元格内容的情况下对相关单元格进行重新排序。我从未找到理想的解决方案,我相信我能够一起破解一些东西,今晚下班后我会查看我的代码,并公布我的进展我能为你做点什么谢谢。等你