UICollectionViewCell programmatically
If you would like so as to add views to your cell, you need to use the init(body:)
methodology, and arrange your view hierarchy there. As an alternative of awakeFromNib you need to model your views within the init
methodology as nicely. You may reset all the pieces inside the same old prepareForReuse
methodology. As you possibly can see by utilizing anchors generally it is price to ditch IB totally. 🎉
class Cell: UICollectionViewCell {
static var identifier: String = "Cell"
weak var textLabel: UILabel!
override init(body: CGRect) {
tremendous.init(body: body)
let textLabel = UILabel(body: .zero)
textLabel.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(textLabel)
NSLayoutConstraint.activate([
contentView.centerXAnchor.constraint(equalTo: textLabel.centerXAnchor),
contentView.centerYAnchor.constraint(equalTo: textLabel.centerYAnchor),
])
self.textLabel = textLabel
reset()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been applied")
}
override func prepareForReuse() {
tremendous.prepareForReuse()
reset()
}
func reset() {
textLabel.textAlignment = .middle
}
}
UICollectionView programmatically
Creating assortment view controllers utilizing solely Swift code requires only some further traces. You may implement loadView
and create your UICollectionView
object there. Retailer a weak
reference of it contained in the controller, and the remainder is similar.
class ViewController: UIViewController {
weak var collectionView: UICollectionView!
var knowledge: [Int] = Array(0..<10)
override func loadView() {
tremendous.loadView()
let collectionView = UICollectionView(
body: .zero,
collectionViewLayout: UICollectionViewFlowLayout()
)
collectionView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(collectionView)
NSLayoutConstraint.activate([
view.topAnchor.constraint(equalTo: collectionView.topAnchor),
view.bottomAnchor.constraint(equalTo: collectionView.bottomAnchor),
view.leadingAnchor.constraint(equalTo: collectionView.leadingAnchor),
view.trailingAnchor.constraint(equalTo: collectionView.trailingAnchor),
])
collectionView = collectionView
}
override func viewDidLoad() {
tremendous.viewDidLoad()
collectionView.dataSource = self
collectionView.delegate = self
collectionView.register(Cell.self, forCellWithReuseIdentifier: Cell.identifier)
collectionView.alwaysBounceVertical = true
collectionView.backgroundColor = .white
}
}
extension ViewController: UICollectionViewDataSource {
func collectionView(
_ collectionView: UICollectionView,
numberOfItemsInSection part: Int
) -> Int {
knowledge.depend
}
func collectionView(
_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath
) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(
withReuseIdentifier: Cell.identifier,
for: indexPath
) as! Cell
let knowledge = knowledge[indexPath.item]
cell.textLabel.textual content = String(knowledge)
return cell
}
}
extension ViewController: UICollectionViewDelegate {
func collectionView(
_ collectionView: UICollectionView,
didSelectItemAt indexPath: IndexPath
) {
}
}
extension ViewController: UICollectionViewDelegateFlowLayout {
func collectionView(
_ collectionView: UICollectionView,
format collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath
) -> CGSize {
.init(width: collectionView.bounds.width, peak: 44)
}
func collectionView(
_ collectionView: UICollectionView,
format collectionViewLayout: UICollectionViewLayout,
insetForSectionAt part: Int
) -> UIEdgeInsets {
.init(prime: 0, left: 0, backside: 0, proper: 0)
}
func collectionView(
_ collectionView: UICollectionView,
format collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAt part: Int
) -> CGFloat {
0
}
func collectionView(
_ collectionView: UICollectionView,
format collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt part: Int
) -> CGFloat {
0
}
}
That was straightforward. Anchors are actually highly effective, Interface Builder is extraordinarily useful, however generally it is simply sooner to create your views from code. The selection is yours, however please do not be afraid of coding consumer interfaces! 😅