mirror of
https://github.com/Instagram/IGListKit
synced 2026-04-24 23:17:24 +00:00
Summary: To demonstrate some more advanced UI customization with IGListKit, and to help make the sample app look more modern, this diff updates the root Demos view controller to adopt the 'grouped inset' style of lists that was introduced in iOS 13. Reviewed By: DimaVartanian Differential Revision: D47050305 fbshipit-source-id: e230bea3c98ecb9f547d4fb04b74f32efcb4d986
112 lines
3.9 KiB
Swift
112 lines
3.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 IGListKit
|
|
import UIKit
|
|
|
|
final class DemoItem: NSObject {
|
|
|
|
let name: String
|
|
let imageName: String
|
|
let controllerClass: UIViewController.Type
|
|
let controllerIdentifier: String?
|
|
|
|
init(
|
|
name: String,
|
|
imageName: String,
|
|
controllerClass: UIViewController.Type,
|
|
controllerIdentifier: String? = nil
|
|
) {
|
|
self.name = name
|
|
self.imageName = imageName
|
|
self.controllerClass = controllerClass
|
|
self.controllerIdentifier = controllerIdentifier
|
|
}
|
|
|
|
}
|
|
|
|
extension DemoItem: ListDiffable {
|
|
|
|
func diffIdentifier() -> NSObjectProtocol {
|
|
return name as NSObjectProtocol
|
|
}
|
|
|
|
func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
|
|
if self === object { return true }
|
|
guard let object = object as? DemoItem else { return false }
|
|
return controllerClass == object.controllerClass && controllerIdentifier == object.controllerIdentifier
|
|
}
|
|
|
|
}
|
|
|
|
final class DemoSectionController: ListSectionController {
|
|
private var object: DemoItem?
|
|
|
|
override func sizeForItem(at index: Int) -> CGSize {
|
|
guard let context = collectionContext else {
|
|
return .zero
|
|
}
|
|
let inset = context.containerInset
|
|
let safeArea = viewController?.view.safeAreaInsets ?? .zero
|
|
let width = context.containerSize.width - (inset.left + inset.right + safeArea.left + safeArea.right)
|
|
return CGSize(width: width, height: 55)
|
|
}
|
|
|
|
override func cellForItem(at index: Int) -> UICollectionViewCell {
|
|
let cell: LabelCell = collectionContext.dequeueReusableCell(for: self, at: index)
|
|
cell.text = object?.name
|
|
cell.imageName = object?.imageName
|
|
cell.style = .grouped
|
|
cell.isTopCell = isFirstSection
|
|
cell.isBottomCell = isLastSection
|
|
if let splitViewController = viewController?.splitViewController {
|
|
cell.disclosureImageView.isHidden = splitViewController.viewControllers.count > 1
|
|
}
|
|
cell.separator.isHidden = cell.isSelected
|
|
return cell
|
|
}
|
|
|
|
override func didUpdate(to object: Any) {
|
|
self.object = object as? DemoItem
|
|
}
|
|
|
|
override func didSelectItem(at index: Int) {
|
|
setSeparatorsHidden(true)
|
|
|
|
let navigationController = UINavigationController()
|
|
navigationController.navigationBar.prefersLargeTitles = true
|
|
|
|
if let identifier = object?.controllerIdentifier {
|
|
let storyboard = UIStoryboard(name: "Demo", bundle: nil)
|
|
let controller = storyboard.instantiateViewController(withIdentifier: identifier)
|
|
controller.title = object?.name
|
|
navigationController.viewControllers = [controller]
|
|
viewController?.showDetailViewController(navigationController, sender: self)
|
|
} else if let controller = object?.controllerClass.init() {
|
|
controller.title = object?.name
|
|
navigationController.viewControllers = [controller]
|
|
viewController?.showDetailViewController(navigationController, sender: self)
|
|
}
|
|
}
|
|
|
|
override func didDeselectItem(at index: Int) {
|
|
setSeparatorsHidden(false)
|
|
}
|
|
|
|
private func setSeparatorsHidden(_ hidden: Bool) {
|
|
if let cell = collectionContext.cellForItem(at: 0, sectionController: self) as? LabelCell {
|
|
cell.separator.isHidden = hidden
|
|
}
|
|
|
|
if section > 0,
|
|
let listAdapter = collectionContext as? ListAdapter,
|
|
let previousSectionController = listAdapter.sectionController(forSection: section - 1),
|
|
let previousCell = collectionContext.cellForItem(at: 0, sectionController: previousSectionController) as? LabelCell {
|
|
previousCell.separator.isHidden = hidden
|
|
}
|
|
}
|
|
}
|