mirror of
https://github.com/Instagram/IGListKit
synced 2026-04-26 07:57:19 +00:00
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
69 lines
1.9 KiB
Swift
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)
|
|
}
|
|
|
|
}
|