假设我正在写一个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
中的数据对适当的单元格进行出列。
只需给它们不同的标识符,然后根据标识符将所需的标识符出列。