IGListKit/Examples/Examples-iOS/IGListKitExamples/SectionControllers/WorkingRangeSectionController.swift

87 lines
2.8 KiB
Swift
Raw Normal View History

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import IGListKit
import UIKit
final class WorkingRangeSectionController: ListSectionController, ListWorkingRangeDelegate {
private var height: Int?
private var downloadedImage: UIImage?
private var task: URLSessionDataTask?
private var urlString: String? {
guard let height = height,
let size = collectionContext?.containerSize
else { return nil }
let width = Int(size.width)
return "https://unsplash.it/" + width.description + "/" + height.description
}
deinit {
task?.cancel()
}
override init() {
super.init()
workingRangeDelegate = self
}
override func numberOfItems() -> Int {
return 2
}
override func sizeForItem(at index: Int) -> CGSize {
let width: CGFloat = collectionContext?.containerSize.width ?? 0
let height: CGFloat = CGFloat(index == 0 ? 55 : (self.height ?? 0))
return CGSize(width: width, height: height)
}
override func cellForItem(at index: Int) -> UICollectionViewCell {
let cellClass: UICollectionViewCell.Type = index == 0 ? LabelCell.self : ImageCell.self
let cell = collectionContext.dequeueReusableCell(of: cellClass, for: self, at: index)
if let cell = cell as? LabelCell {
cell.text = urlString
} else if let cell = cell as? ImageCell {
cell.setImage(image: downloadedImage)
}
return cell
}
override func didUpdate(to object: Any) {
self.height = object as? Int
}
// MARK: ListWorkingRangeDelegate
func listAdapter(_ listAdapter: ListAdapter, sectionControllerWillEnterWorkingRange sectionController: ListSectionController) {
guard downloadedImage == nil,
task == nil,
let urlString = urlString,
let url = URL(string: urlString)
else { return }
print("Downloading image \(urlString) for section \(self.section)")
task = URLSession.shared.dataTask(with: url) { data, _, error in
guard let data = data, let image = UIImage(data: data) else {
return print("Error downloading \(urlString): " + String(describing: error))
}
DispatchQueue.main.async {
self.downloadedImage = image
if let cell = self.collectionContext?.cellForItem(at: 1, sectionController: self) as? ImageCell {
cell.setImage(image: image)
}
}
}
task?.resume()
}
func listAdapter(_ listAdapter: ListAdapter, sectionControllerDidExitWorkingRange sectionController: ListSectionController) {}
}