IGListKit/Examples/Examples-iOS/IGListKitExamples/Views/CompositionLayoutCell.swift
Maxime Ollivier 77a4582ce5 create UICollectionViewCompositionalLayout example
Summary:
Lets try using `UICollectionViewCompositionalLayout` with IGListKit! It does require some data plumbing, but maybe we can make that simpler in the future. For now, lets keep things simple and see how it feels.

This diff replicates the `MixedDataViewController` example starting with the expandable text.

Differential Revision: D52260529

fbshipit-source-id: 5579b8d6fe5d1f95ed282f821e6555a6a56b1c1c
2023-12-19 07:17:30 -08:00

69 lines
1.9 KiB
Swift

/*
* 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 UIKit
/// A cell that works with composition layout.
/// 1. It overrides -sizeThatFits for cell sizing
/// 2. Unlike LabelCell, it doesn't need to add separators, since that's taken care of by the layout
class CompositionLayoutCell: UICollectionViewCell {
private let insets = UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16)
override init(frame: CGRect) {
super.init(frame: frame)
contentView.addSubview(label)
contentView.backgroundColor = UIColor.systemBackground
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
label.frame = bounds.inset(by: insets)
}
override func prepareForReuse() {
super.prepareForReuse()
contentView.backgroundColor = UIColor.systemBackground
contentView.layer.cornerRadius = 0
}
// MARK: Label
private let label: UILabel = {
let label = UILabel()
label.backgroundColor = .clear
label.font = UIFont.systemFont(ofSize: 18)
return label
}()
var text: String? {
get {
return label.text
}
set {
label.text = newValue
}
}
var expanded:Bool = false {
didSet {
label.numberOfLines = expanded ? 0 : 1
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
let labelMaxSize = CGRect(origin: .zero, size: size).inset(by: insets).size
let labelSize = label.sizeThatFits(labelMaxSize)
return CGSize(width: labelSize.width + insets.left + insets.right,
height: labelSize.height + insets.top + insets.bottom)
}
}