我有UITableView,其中每个单元格都有一个UIImage,并且使用JSON从API下载图像。
我通过背景线程处理了初始图像和数据。但是,当用户在表格视图中向下滚动时,其他单元格的图像开始下载,因此这些单元格需要一些刷新。
我考虑在UIImageView中添加一个ActivityIndicator,因此用户会注意到正在下载图像。
其他信息,UIImageView位于UIStackView中。我想过isHidden
方法,无法实现。
感谢您的时间。
答案 0 :(得分:1)
通常我建议使用像Kingfisher这样的库来为您管理(我相信您可以设置占位符视图以便在您重新加载时显示)但是如果您想这样做手动你可以有类似
的东西enum LoadingState {
case notLoading
case loading
case loaded(UIImage)
}
class MyTableViewCell: UITableViewCell {
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
let imageStackView = UIStackView()
let myImageView = UIImageView() // can't be named imageView because UITableViewCell already has one with that name
var loadingState: LoadingState = .notLoading { // many ways you could do this, you just need one or more "update" mechanisms to start/stop the spinner and set your image
didSet {
switch loadingState {
case .notLoading:
myImageView.image = nil
activityIndicator.stopAnimating()
case .loading:
myImageView.image = nil
activityIndicator.startAnimating()
case let .loaded(img):
myImageView.image = img
activityIndicator.stopAnimating()
}
}
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
configure()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configure()
}
private func configure() {
contentView.addSubview(activityIndicator)
contentView.addSubview(imageStackView)
imageStackView.addArrangedSubview(myImageView)
// constrain activity indicator and stack view
}
override func prepareForReuse() {
super.prepareForReuse()
loadingState = .notLoading
}
}