Created
March 25, 2020 13:44
-
-
Save artur-ios-dev/8a12012040084045aa4980ff9aab4ad0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//: A UIKit based Playground for presenting user interface | |
import UIKit | |
import PlaygroundSupport | |
final class SampleCollectionReusableView: UICollectionReusableView { | |
private let titleLabel = UILabel() | |
override init(frame: CGRect) { | |
super.init(frame: frame) | |
titleLabel.textColor = .white | |
titleLabel.translatesAutoresizingMaskIntoConstraints = false | |
addSubview(titleLabel) | |
NSLayoutConstraint.activate([ | |
titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor), | |
titleLabel.topAnchor.constraint(equalTo: topAnchor), | |
titleLabel.trailingAnchor.constraint(equalTo: trailingAnchor), | |
titleLabel.bottomAnchor.constraint(equalTo: bottomAnchor) | |
]) | |
} | |
required init?(coder aDecoder: NSCoder) { | |
fatalError("init(coder:) has not been implemented") | |
} | |
func fill(with title: String) { | |
titleLabel.text = title | |
} | |
} | |
final class SampleViewController : UIViewController { | |
private lazy var diffableDataSource: UICollectionViewDiffableDataSource<Int, UIColor> = { | |
let dataSource = UICollectionViewDiffableDataSource<Int, UIColor>(collectionView: collectionView) { collectionView, indexPath, item in | |
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sampleIdentifier", for: indexPath) | |
cell.backgroundColor = item | |
return cell | |
} | |
dataSource.supplementaryViewProvider = { collectionView, kind, indexPath -> UICollectionReusableView? in | |
switch kind { | |
case UICollectionView.elementKindSectionHeader: | |
guard let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "sampleHeaderIdentifier", for: indexPath) as? SampleCollectionReusableView else { | |
fatalError("Header is not registered") | |
} | |
headerView.fill(with: "My Awesome Colours") | |
return headerView | |
default: | |
fatalError("Element \(kind) not supported") | |
} | |
} | |
return dataSource | |
}() | |
private lazy var collectionView: UICollectionView = { | |
let layout = UICollectionViewFlowLayout() | |
layout.itemSize = CGSize(width: 100, height: 100) | |
layout.headerReferenceSize = CGSize(width: 0, height: 60) | |
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) | |
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "sampleIdentifier") | |
collectionView.register(SampleCollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "sampleHeaderIdentifier") | |
return collectionView | |
}() | |
private let colors: [UIColor] = [ | |
.brown, | |
.purple, | |
.systemBlue, | |
.systemRed, | |
.systemGray, | |
.systemPink | |
] | |
private func update(with items: [UIColor]) { | |
var snapshot = NSDiffableDataSourceSnapshot<Int, UIColor>() | |
snapshot.appendSections([0]) | |
snapshot.appendItems(items, toSection: 0) | |
diffableDataSource.apply(snapshot, animatingDifferences: true) | |
} | |
override func loadView() { | |
view = collectionView | |
view.backgroundColor = .black | |
} | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
collectionView.dataSource = diffableDataSource | |
} | |
override func viewDidAppear(_ animated: Bool) { | |
super.viewDidAppear(animated) | |
update(with: colors) | |
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { | |
self.update(with: self.colors.shuffled()) | |
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { | |
self.update(with: self.colors.shuffled()) | |
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { | |
self.update(with: self.colors.shuffled()) | |
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { | |
self.update(with: self.colors.shuffled()) | |
} | |
} | |
} | |
} | |
} | |
} | |
PlaygroundPage.current.liveView = SampleViewController() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment