如何使用Swift将ActivityIndi​​cator放在UITmage里面的UITmage中?

时间:2017-11-18 14:30:08

标签: ios swift uitableview uiactivityindicatorview activity-indicator

我有UITableView,其中每个单元格都有一个UIImage,并且使用JSON从API下载图像。

我通过背景线程处理了初始图像和数据。但是,当用户在表格视图中向下滚动时,其他单元格的图像开始下载,因此这些单元格需要一些刷新。

我考虑在UIImageView中添加一个ActivityIndi​​cator,因此用户会注意到正在下载图像。

其他信息,UIImageView位于UIStackView中。我想过isHidden方法,无法实现。

感谢您的时间。

1 个答案:

答案 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
    }
}