滚动时更改Swift集合视图数据

时间:2016-08-12 01:44:30

标签: ios swift uicollectionview alignment

当向上滚动到底部然后再向上滚动时,我的集合视图单元格正在被修改。

在我的viewDidLoad中,我有一个Parse查询,它从数据库中获取所有值,然后从主线程调用reloadData。

在初始加载时,可正确显示可查看的单元格。

但是当我向下滚动时,加载了不可见的单元格,其中1/3显示不正确。

然后当我向上滚动到初始可查看单元格时,第一个单元格无法正确显示。

由于显示不正确,我的意思是在我的数据库中是一个用于对齐的字段。这可以保持中,左或右弦。

此值是我的图像和按钮应在单元格中对齐的方式。

这是我的cellForRow函数。

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{
    let cell: FeedThumbnail = collectionView.dequeueReusableCellWithReuseIdentifier("feed_cell", forIndexPath: indexPath) as! FeedThumbnail

    //handle cell alignment
    if(align[indexPath.row] == "left"){
        //leave alignment as is for buttons
        if(cell.picture.frame.origin.x == 0){
            cell.picture.frame.offsetInPlace(dx: -75, dy: 0)
        }
    }

    else if(align[indexPath.row] == "center"){
        cell.holder_view.frame.offsetInPlace(dx: 105 - cell.holder_view.frame.origin.x, dy: 0)
        //leave image as is
    }

    else if(align[indexPath.row] == "right"){
        cell.holder_view.frame.offsetInPlace(dx: 220 - cell.holder_view.frame.origin.x, dy: 0)
        cell.picture.frame.offsetInPlace(dx: 100 - cell.picture.frame.origin.x, dy: 0)
    }

    return cell
}

这是我的集合视图单元格的类

 import UIKit

class FeedThumbnail: UICollectionViewCell {

 @IBOutlet weak var picture: UIImageView!
 @IBOutlet weak var comment_btn: UIButton!
 @IBOutlet weak var heart_btn: UIButton!
 @IBOutlet weak var rescip_btn: UIButton!
 @IBOutlet weak var og_btn: UIButton!
 @IBOutlet weak var name_lbl: UIButton!
 @IBOutlet weak var holder_view: UIView!
}

2 个答案:

答案 0 :(得分:1)

像Lumialxk和RPK所说。 我需要在修改它之前刷新单元格origin.x。

我想我并不明白细胞会以它们的方式重复使用。

解决方案是覆盖prepareForReuse并在修改之前将frame.origin.x设置回原始值。

导入UIKit

class FeedThumbnail:UICollectionViewCell {

@IBOutlet weak var picture: UIImageView!
@IBOutlet weak var comment_btn: UIButton!
@IBOutlet weak var heart_btn: UIButton!
@IBOutlet weak var rescip_btn: UIButton!
@IBOutlet weak var og_btn: UIButton!
@IBOutlet weak var name_lbl: UIButton!
@IBOutlet weak var holder_view: UIView!


override func prepareForReuse() {
    picture.frame.origin.x = 0
    holder_view.frame.origin.x = 0
    super.prepareForReuse()
}

}

答案 1 :(得分:0)

cellFor...中有条件,如下:

if(cell.picture.frame.origin.x == 0){...

如果某个单元格被重复使用,则"left"但不满足您的条件,因此它的外观与重复使用之前的外观相同。你应该对此做点什么。以下是示例代码:

if(cell.picture.frame.origin.x == 0){
    ...
} else {
    // make it a left cell
}