0

저는 각 셀에 하나의 UIImage가 있고 이미지가 JSON을 사용하여 API에서 다운로드되는 UITableView가 있습니다.Swift를 사용하여 UITableView 안에 ActivityIndicator를 UIImage 안에 넣는 방법?

백그라운드 스레딩을 통해 초기 이미지와 데이터를 처리했습니다. 그러나 사용자가 테이블보기 내에서 아래로 스크롤하면 다른 셀의 이미지가 다운로드되기 시작하므로 해당 셀에 약간의 새로 고침이 필요합니다.

UIImageView 내에 ActivityIndicator를 추가하는 것에 대해 생각 했으므로 사용자가 이미지를 다운로드하고 있음을 알 수 있습니다.

추가 정보, UIImageView는 UIStackView 내부에 있습니다. 나는 isHidden 메서드에 대해 생각, 구현할 수 없습니다.

감사합니다.

답변

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 
    } 
} 
+0

완벽한 작품입니다. – sc13