From 5793ecd17360f8713f07c304d2e901841c1a6437 Mon Sep 17 00:00:00 2001 From: Kishikawa Katsumi Date: Mon, 30 Dec 2019 03:33:35 +0900 Subject: [PATCH] GridView tests --- .../project.pbxproj | 12 +- .../Assets.xcassets/Contents.json | 6 - .../chevron.left.imageset/Contents.json | 15 -- .../chevron.left.imageset/chevron.left.pdf | Bin 4014 -> 0 bytes .../chevron.right.imageset/Contents.json | 21 -- .../chevron.right.imageset/chevron.right.pdf | Bin 4016 -> 0 bytes .../GridViewTests.swift | 189 ++++++++++++++++++ .../ListViewTests.swift | 117 ++++------- .../UIKitInteroperability.swift | 1 - 9 files changed, 230 insertions(+), 131 deletions(-) delete mode 100644 Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/Contents.json delete mode 100644 Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/chevron.left.imageset/Contents.json delete mode 100644 Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/chevron.left.imageset/chevron.left.pdf delete mode 100644 Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/chevron.right.imageset/Contents.json delete mode 100644 Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/chevron.right.imageset/chevron.right.pdf create mode 100644 Tests/IBPCollectionViewCompositionalLayoutTests/GridViewTests.swift delete mode 120000 Tests/IBPCollectionViewCompositionalLayoutTests/UIKitInteroperability.swift diff --git a/IBPCollectionViewCompositionalLayout.xcodeproj/project.pbxproj b/IBPCollectionViewCompositionalLayout.xcodeproj/project.pbxproj index e448941..a59e913 100644 --- a/IBPCollectionViewCompositionalLayout.xcodeproj/project.pbxproj +++ b/IBPCollectionViewCompositionalLayout.xcodeproj/project.pbxproj @@ -67,11 +67,10 @@ 147537BF230A190F00337C1B /* IBPNSCollectionLayoutSpacing_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 147537BD230A190F00337C1B /* IBPNSCollectionLayoutSpacing_Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 147537C7230A6A1300337C1B /* IBPNSCollectionLayoutAnchor_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 147537C5230A6A1300337C1B /* IBPNSCollectionLayoutAnchor_Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1477B43023B906DE00373474 /* DiffableDataSources.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1477B42F23B906DE00373474 /* DiffableDataSources.framework */; }; + 1477B43823B9182000373474 /* GridViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1477B43723B9182000373474 /* GridViewTests.swift */; }; 14B9585323B8DE3A00DF3B7F /* ListViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B9585223B8DE3A00DF3B7F /* ListViewTests.swift */; }; 14B9585523B8E07B00DF3B7F /* IBPCollectionViewCompositionalLayoutInteroperability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B9585423B8E07B00DF3B7F /* IBPCollectionViewCompositionalLayoutInteroperability.swift */; }; 14B9585E23B8E21000DF3B7F /* DiffableDataSourceInteroperability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B9585623B8E12400DF3B7F /* DiffableDataSourceInteroperability.swift */; }; - 14B9586023B8E27F00DF3B7F /* UIKitInteroperability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B9585F23B8E27F00DF3B7F /* UIKitInteroperability.swift */; }; - 14B9586423B8E35C00DF3B7F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 14B9586323B8E35C00DF3B7F /* Assets.xcassets */; }; 14B9586C23B8E60700DF3B7F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B9586B23B8E60700DF3B7F /* AppDelegate.swift */; }; 14B9587523B8E60900DF3B7F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 14B9587423B8E60900DF3B7F /* Assets.xcassets */; }; 14B9587823B8E60900DF3B7F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 14B9587623B8E60900DF3B7F /* LaunchScreen.storyboard */; }; @@ -166,11 +165,10 @@ 1477B42D23B906B800373474 /* DiffableDataSources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DiffableDataSources.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1477B42F23B906DE00373474 /* DiffableDataSources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DiffableDataSources.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1477B43123B906DE00373474 /* DifferenceKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DifferenceKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1477B43723B9182000373474 /* GridViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GridViewTests.swift; sourceTree = ""; }; 14B9585223B8DE3A00DF3B7F /* ListViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListViewTests.swift; sourceTree = ""; }; 14B9585423B8E07B00DF3B7F /* IBPCollectionViewCompositionalLayoutInteroperability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBPCollectionViewCompositionalLayoutInteroperability.swift; sourceTree = ""; }; 14B9585623B8E12400DF3B7F /* DiffableDataSourceInteroperability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiffableDataSourceInteroperability.swift; sourceTree = ""; }; - 14B9585F23B8E27F00DF3B7F /* UIKitInteroperability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIKitInteroperability.swift; sourceTree = ""; }; - 14B9586323B8E35C00DF3B7F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 14B9586923B8E60700DF3B7F /* HostApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HostApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 14B9586B23B8E60700DF3B7F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 14B9587423B8E60900DF3B7F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -360,10 +358,9 @@ isa = PBXGroup; children = ( 14B9585223B8DE3A00DF3B7F /* ListViewTests.swift */, + 1477B43723B9182000373474 /* GridViewTests.swift */, 14B9585423B8E07B00DF3B7F /* IBPCollectionViewCompositionalLayoutInteroperability.swift */, 14B9585623B8E12400DF3B7F /* DiffableDataSourceInteroperability.swift */, - 14B9585F23B8E27F00DF3B7F /* UIKitInteroperability.swift */, - 14B9586323B8E35C00DF3B7F /* Assets.xcassets */, ); path = IBPCollectionViewCompositionalLayoutTests; sourceTree = ""; @@ -540,7 +537,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 14B9586423B8E35C00DF3B7F /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -589,9 +585,9 @@ buildActionMask = 2147483647; files = ( 14B9585523B8E07B00DF3B7F /* IBPCollectionViewCompositionalLayoutInteroperability.swift in Sources */, - 14B9586023B8E27F00DF3B7F /* UIKitInteroperability.swift in Sources */, 14B9585323B8DE3A00DF3B7F /* ListViewTests.swift in Sources */, 14B9585E23B8E21000DF3B7F /* DiffableDataSourceInteroperability.swift in Sources */, + 1477B43823B9182000373474 /* GridViewTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/Contents.json b/Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/chevron.left.imageset/Contents.json b/Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/chevron.left.imageset/Contents.json deleted file mode 100644 index 485679c..0000000 --- a/Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/chevron.left.imageset/Contents.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "chevron.left.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "preserves-vector-representation" : true - } -} \ No newline at end of file diff --git a/Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/chevron.left.imageset/chevron.left.pdf b/Tests/IBPCollectionViewCompositionalLayoutTests/Assets.xcassets/chevron.left.imageset/chevron.left.pdf deleted file mode 100644 index 09887dce35cf6c0d45d6abd3f71a4e9cb069cb11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4014 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 AJ^%m! diff --git a/Tests/IBPCollectionViewCompositionalLayoutTests/GridViewTests.swift b/Tests/IBPCollectionViewCompositionalLayoutTests/GridViewTests.swift new file mode 100644 index 0000000..1047a62 --- /dev/null +++ b/Tests/IBPCollectionViewCompositionalLayoutTests/GridViewTests.swift @@ -0,0 +1,189 @@ +import XCTest +import IBPCollectionViewCompositionalLayout + +class GridViewTests: XCTestCase { + func testViewController() { + let viewController = GridViewController() + + let window = UIWindow(frame: UIScreen.main.bounds) + window.rootViewController = viewController + window.makeKeyAndVisible() + + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) + + let collectionView = viewController.collectionView! + let fractionalWidth: CGFloat = 0.2 + let numberOfColumns: CGFloat = floor(1 / fractionalWidth) + let width: CGFloat = window.bounds.width * fractionalWidth + let height = width + let numberOfItems = collectionView.numberOfItems(inSection: 0) + + if #available(iOS 11.0, *) { + let safeAreaInsets = viewController.view.safeAreaInsets + + XCTAssertEqual(collectionView.adjustedContentInset, safeAreaInsets) + XCTAssertEqual(collectionView.contentOffset, CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)) + XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: ceil(CGFloat(numberOfItems) / numberOfColumns) * window.bounds.width * fractionalWidth)) + + for case (let index, let cell as UICollectionViewCell) in collectionView.subviews.enumerated() { + XCTAssertEqual(cell.frame, CGRect(x: width * (CGFloat(index).truncatingRemainder(dividingBy: numberOfColumns)), y: height * floor(CGFloat(index) / numberOfColumns), width: width, height: height)) + } + } else { + + } + } + + func testNavigationController() { + let viewController = GridViewController() + + let window = UIWindow(frame: UIScreen.main.bounds) + let navigationController = UINavigationController(rootViewController: viewController) + window.rootViewController = navigationController + window.makeKeyAndVisible() + + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) + + let collectionView = viewController.collectionView! + let fractionalWidth: CGFloat = 0.2 + let numberOfColumns: CGFloat = floor(1 / fractionalWidth) + let width: CGFloat = window.bounds.width * fractionalWidth + let height = width + let numberOfItems = collectionView.numberOfItems(inSection: 0) + + if #available(iOS 11.0, *) { + let safeAreaInsets = viewController.view.safeAreaInsets + + XCTAssertEqual(collectionView.adjustedContentInset, safeAreaInsets) + XCTAssertEqual(collectionView.contentOffset, CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)) + XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: ceil(CGFloat(numberOfItems) / numberOfColumns) * window.bounds.width * fractionalWidth)) + + for case (let index, let cell as UICollectionViewCell) in collectionView.subviews.enumerated() { + XCTAssertEqual(cell.frame, CGRect(x: width * (CGFloat(index).truncatingRemainder(dividingBy: numberOfColumns)), y: height * floor(CGFloat(index) / numberOfColumns), width: width, height: height)) + } + } else { + + } + } + + func testTabBarController() { + let viewController = GridViewController() + + let window = UIWindow(frame: UIScreen.main.bounds) + let tabBarController = UITabBarController() + tabBarController.viewControllers = [viewController] + window.rootViewController = tabBarController + window.makeKeyAndVisible() + + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) + + let collectionView = viewController.collectionView! + let fractionalWidth: CGFloat = 0.2 + let numberOfColumns: CGFloat = floor(1 / fractionalWidth) + let width: CGFloat = window.bounds.width * fractionalWidth + let height = width + let numberOfItems = collectionView.numberOfItems(inSection: 0) + + if #available(iOS 11.0, *) { + let safeAreaInsets = viewController.view.safeAreaInsets + + XCTAssertEqual(collectionView.adjustedContentInset, safeAreaInsets) + XCTAssertEqual(collectionView.contentOffset, CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)) + XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: ceil(CGFloat(numberOfItems) / numberOfColumns) * window.bounds.width * fractionalWidth)) + + for case (let index, let cell as UICollectionViewCell) in collectionView.subviews.enumerated() { + XCTAssertEqual(cell.frame, CGRect(x: width * (CGFloat(index).truncatingRemainder(dividingBy: numberOfColumns)), y: height * floor(CGFloat(index) / numberOfColumns), width: width, height: height)) + } + } else { + + } + } + + func testNavigationControllerInTabBarController() { + let viewController = GridViewController() + + let window = UIWindow(frame: UIScreen.main.bounds) + let navigationController = UINavigationController(rootViewController: viewController) + let tabBarController = UITabBarController() + tabBarController.viewControllers = [navigationController] + window.rootViewController = tabBarController + window.makeKeyAndVisible() + + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) + + let collectionView = viewController.collectionView! + let fractionalWidth: CGFloat = 0.2 + let numberOfColumns: CGFloat = floor(1 / fractionalWidth) + let width: CGFloat = window.bounds.width * fractionalWidth + let height = width + let numberOfItems = collectionView.numberOfItems(inSection: 0) + + if #available(iOS 11.0, *) { + let safeAreaInsets = viewController.view.safeAreaInsets + + XCTAssertEqual(collectionView.adjustedContentInset, safeAreaInsets) + XCTAssertEqual(collectionView.contentOffset, CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)) + XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: ceil(CGFloat(numberOfItems) / numberOfColumns) * window.bounds.width * fractionalWidth)) + + for case (let index, let cell as UICollectionViewCell) in collectionView.subviews.enumerated() { + XCTAssertEqual(cell.frame, CGRect(x: width * (CGFloat(index).truncatingRemainder(dividingBy: numberOfColumns)), y: height * floor(CGFloat(index) / numberOfColumns), width: width, height: height)) + } + } else { + + } + } +} + +class GridViewController: UIViewController { + enum Section { + case main + } + + var dataSource: UICollectionViewDiffableDataSource! = nil + var collectionView: UICollectionView! = nil + + override func viewDidLoad() { + super.viewDidLoad() + navigationItem.title = "Grid" + configureHierarchy() + configureDataSource() + } +} + +extension GridViewController { + private func createLayout() -> UICollectionViewLayout { + let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.2), heightDimension: .fractionalHeight(1)) + let item = NSCollectionLayoutItem(layoutSize: itemSize) + + let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .fractionalWidth(0.2)) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + + let section = NSCollectionLayoutSection(group: group) + + let layout = UICollectionViewCompositionalLayout(section: section) + return layout + } +} + +extension GridViewController { + private func configureHierarchy() { + collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: createLayout()) + collectionView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: String(describing: UICollectionViewCell.self)) + view.addSubview(collectionView) + } + + private func configureDataSource() { + dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) { (collectionView, indexPath, identifier) in + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: UICollectionViewCell.self), for: indexPath) + cell.contentView.backgroundColor = .white + cell.contentView.layer.borderWidth = 1 + cell.contentView.layer.borderColor = UIColor.black.withAlphaComponent(0.5).cgColor + return cell + } + + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([.main]) + snapshot.appendItems(Array(0..<94)) + dataSource.apply(snapshot, animatingDifferences: false) + } +} diff --git a/Tests/IBPCollectionViewCompositionalLayoutTests/ListViewTests.swift b/Tests/IBPCollectionViewCompositionalLayoutTests/ListViewTests.swift index 8cdb0de..e999c07 100644 --- a/Tests/IBPCollectionViewCompositionalLayoutTests/ListViewTests.swift +++ b/Tests/IBPCollectionViewCompositionalLayoutTests/ListViewTests.swift @@ -12,13 +12,19 @@ class ListViewTests: XCTestCase { RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) let collectionView = viewController.collectionView! + let height: CGFloat = 44 + let numberOfItems = collectionView.numberOfItems(inSection: 0) if #available(iOS 11.0, *) { let safeAreaInsets = viewController.view.safeAreaInsets XCTAssertEqual(collectionView.adjustedContentInset, safeAreaInsets) XCTAssertEqual(collectionView.contentOffset, CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)) - XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: 44 * 94)) + XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: height * CGFloat(numberOfItems))) + + for case (let index, let cell as UICollectionViewCell) in collectionView.subviews.enumerated() { + XCTAssertEqual(cell.frame, CGRect(x: 0, y: CGFloat(index) * height, width: window.bounds.width, height: height)) + } } else { } @@ -35,13 +41,19 @@ class ListViewTests: XCTestCase { RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) let collectionView = viewController.collectionView! + let height: CGFloat = 44 + let numberOfItems = collectionView.numberOfItems(inSection: 0) if #available(iOS 11.0, *) { let safeAreaInsets = viewController.view.safeAreaInsets XCTAssertEqual(collectionView.adjustedContentInset, safeAreaInsets) XCTAssertEqual(collectionView.contentOffset, CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)) - XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: 44 * 94)) + XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: height * CGFloat(numberOfItems))) + + for case (let index, let cell as UICollectionViewCell) in collectionView.subviews.enumerated() { + XCTAssertEqual(cell.frame, CGRect(x: 0, y: CGFloat(index) * height, width: window.bounds.width, height: height)) + } } else { } @@ -59,13 +71,19 @@ class ListViewTests: XCTestCase { RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) let collectionView = viewController.collectionView! + let height: CGFloat = 44 + let numberOfItems = collectionView.numberOfItems(inSection: 0) if #available(iOS 11.0, *) { let safeAreaInsets = viewController.view.safeAreaInsets XCTAssertEqual(collectionView.adjustedContentInset, safeAreaInsets) XCTAssertEqual(collectionView.contentOffset, CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)) - XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: 44 * 94)) + XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: height * CGFloat(numberOfItems))) + + for case (let index, let cell as UICollectionViewCell) in collectionView.subviews.enumerated() { + XCTAssertEqual(cell.frame, CGRect(x: 0, y: CGFloat(index) * height, width: window.bounds.width, height: height)) + } } else { } @@ -84,13 +102,19 @@ class ListViewTests: XCTestCase { RunLoop.main.run(until: Date(timeIntervalSinceNow: 0)) let collectionView = viewController.collectionView! + let height: CGFloat = 44 + let numberOfItems = collectionView.numberOfItems(inSection: 0) if #available(iOS 11.0, *) { let safeAreaInsets = viewController.view.safeAreaInsets XCTAssertEqual(collectionView.adjustedContentInset, safeAreaInsets) XCTAssertEqual(collectionView.contentOffset, CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)) - XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: 44 * 94)) + XCTAssertEqual(collectionView.contentSize, CGSize(width: window.bounds.width, height: height * CGFloat(numberOfItems))) + + for case (let index, let cell as UICollectionViewCell) in collectionView.subviews.enumerated() { + XCTAssertEqual(cell.frame, CGRect(x: 0, y: CGFloat(index) * height, width: window.bounds.width, height: height)) + } } else { } @@ -115,14 +139,11 @@ class ListViewController: UIViewController { extension ListViewController { private func createLayout() -> UICollectionViewLayout { - let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), - heightDimension: .fractionalHeight(1)) + let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1)) let item = NSCollectionLayoutItem(layoutSize: itemSize) - let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), - heightDimension: .absolute(44)) - let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, - subitems: [item]) + let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(44)) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) let section = NSCollectionLayoutSection(group: group) @@ -135,15 +156,16 @@ extension ListViewController { private func configureHierarchy() { collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: createLayout()) collectionView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - collectionView.backgroundColor = .systemBackground - collectionView.register(ListCell.self, forCellWithReuseIdentifier: ListCell.reuseIdentifier) + collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: String(describing: UICollectionViewCell.self)) view.addSubview(collectionView) - collectionView.delegate = self } + private func configureDataSource() { dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) { (collectionView, indexPath, identifier) in - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ListCell.reuseIdentifier, for: indexPath) as? ListCell else { fatalError("Cannot create new cell") } - cell.label.text = "\(identifier)" + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: UICollectionViewCell.self), for: indexPath) + cell.contentView.backgroundColor = .white + cell.contentView.layer.borderWidth = 1 + cell.contentView.layer.borderColor = UIColor.black.withAlphaComponent(0.5).cgColor return cell } @@ -153,68 +175,3 @@ extension ListViewController { dataSource.apply(snapshot, animatingDifferences: false) } } - -extension ListViewController: UICollectionViewDelegate { - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - collectionView.deselectItem(at: indexPath, animated: true) - } -} - -class ListCell: UICollectionViewCell { - static let reuseIdentifier = "list-cell-reuse-identifier" - let label = UILabel() - let accessoryImageView = UIImageView() - let seperatorView = UIView() - - override init(frame: CGRect) { - super.init(frame: frame) - configure() - } - - required init?(coder: NSCoder) { - fatalError("not implemented") - } -} - -extension ListCell { - func configure() { - seperatorView.translatesAutoresizingMaskIntoConstraints = false - seperatorView.backgroundColor = .lightGray - contentView.addSubview(seperatorView) - - label.translatesAutoresizingMaskIntoConstraints = false - label.adjustsFontForContentSizeCategory = true - label.font = .preferredFont(forTextStyle: .body) - contentView.addSubview(label) - - accessoryImageView.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(accessoryImageView) - - selectedBackgroundView = UIView() - selectedBackgroundView?.backgroundColor = UIColor.lightGray.withAlphaComponent(0.3) - - let rtl = effectiveUserInterfaceLayoutDirection == .rightToLeft - let chevronImageName = rtl ? "chevron.left" : "chevron.right" - let chevronImage = UIImage(systemName: chevronImageName) - accessoryImageView.image = chevronImage - accessoryImageView.tintColor = UIColor.lightGray.withAlphaComponent(0.7) - - let inset: CGFloat = 10 - NSLayoutConstraint.activate([ - label.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: inset), - label.topAnchor.constraint(equalTo: contentView.topAnchor, constant: inset), - label.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -inset), - label.trailingAnchor.constraint(equalTo: accessoryImageView.leadingAnchor, constant: -inset), - - accessoryImageView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor), - accessoryImageView.widthAnchor.constraint(equalToConstant: 13), - accessoryImageView.heightAnchor.constraint(equalToConstant: 20), - accessoryImageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -inset), - - seperatorView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: inset), - seperatorView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), - seperatorView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -inset), - seperatorView.heightAnchor.constraint(equalToConstant: 0.5) - ]) - } -} diff --git a/Tests/IBPCollectionViewCompositionalLayoutTests/UIKitInteroperability.swift b/Tests/IBPCollectionViewCompositionalLayoutTests/UIKitInteroperability.swift deleted file mode 120000 index 32c09d5..0000000 --- a/Tests/IBPCollectionViewCompositionalLayoutTests/UIKitInteroperability.swift +++ /dev/null @@ -1 +0,0 @@ -../../Example/Example/UIKitInteroperability.swift \ No newline at end of file