假设我正在写一个Twitter克隆,用户可以在其中发布消息和照片。我正在UITableView中呈现tweets。对于有照片的tweets,我将把这些照片放到UICollectionView中,称之为photoCollectionView,这个UICollectionView是单元格的子视图。问题是,如果一条微博没有照片怎么办?如何隐藏photoCollectionView并动态设置单元格高度?到目前为止,我可以想到两个选择:
选项1:使用楼层板和自动布局。无论如何,在我的故事板中添加photoCollectionView,但使其成为height = 0。但是,我必须设置约束,因为这就是我使用tweetTableView.rowHeight = UITableViewAutomaticDimension的方式。因此,我为photoCollectionView设置了顶部、左侧、右侧和高度约束。那么在TweetCell课上我有:

class TweetCell: UITableViewCell {
    @IBOutlet weak var photoCollectionView: UICollectionView!

    var photos: [UIImage]? {
        didSet {
            if let assets = photos {
                photoCollectionView.delegate = self
                photoCollectionView.frame.size.height = <Some number>
            } else {
                photoCollectionView.frame.size.height = 0
            }
        }
    }

    override func prepareForReuse() {
        photoCollectionView.delegate = nil
        photoCollectionView.frame.size.height = 0
    }
}

extension TweetCell: UICollectionViewDelegate, UICollectionViewDataSource {
    ...
}

选项2:不要将其添加到故事板中:
class TweetCell: UICollectionViewCell {
    private var photoCollectionView: UICollectionView?
    var photos: [UIImage]? {
        didSet {
            if let assets = photos {
                photoCollectionView = UICollectionView.init(...)
                photoCollectionView.delegate = self
            }
        }
    }

    // Then pretty much the same as above
}

然后,在我的TweetTableViewController中,我呈现所有tweets,我需要手动设置行高:
override func cellHeightForRowAt (indexPath: IndexPath) -> CGFloat {
    let cell = tweetTableView.cellForRow(at: indexPath) as? TweetCell
    if let photos = cell?.photos {
        return <Some number>
    }

    return 20    // Suppose default height is 20, to display other info
}

两种选择都给了我我想要的,但是有没有更好的方法呢?这种方式似乎不太有效:
选项1使用prepareForReuse,根据Developer Guide,我应该只重置与内容无关的属性。
选项2动态添加UICollectionView,如果用户滚动得很快怎么办?

最佳答案

选项3:有两个原型单元。一个用于有照片的推特,另一个用于没有照片的推特。根据cellForRowAt中的数据对适当的单元格进行出列。
只需给它们不同的标识符,然后根据标识符将所需的标识符出列。

07-28 09:42