// Copyright 2018-present the Material Components for iOS authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import Foundation import MaterialComponents.MaterialContainerScheme import MaterialComponents.MaterialList import MaterialComponents.MaterialShadowElevations class BaseCellExample : UIViewController { private let arbitraryCellHeight: CGFloat = 75 fileprivate let baseCellIdentifier: String = "baseCellIdentifier" fileprivate let numberOfCells: Int = 100 var containerScheme: MDCContainerScheming = MDCContainerScheme() private lazy var collectionView: UICollectionView = { return UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout()) }() private var collectionViewLayout: UICollectionViewFlowLayout { return collectionView.collectionViewLayout as! UICollectionViewFlowLayout } private var collectionViewEstimatedCellSize: CGSize { return CGSize(width: collectionView.bounds.size.width - 20, height: arbitraryCellHeight) } override func viewDidLoad() { super.viewDidLoad() parent?.automaticallyAdjustsScrollViewInsets = false automaticallyAdjustsScrollViewInsets = false setUpCollectionView() } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() positionCollectionView() } func setUpCollectionView() { collectionViewLayout.estimatedItemSize = collectionViewEstimatedCellSize collectionViewLayout.minimumInteritemSpacing = 5 collectionViewLayout.minimumLineSpacing = 5 collectionView.backgroundColor = containerScheme.colorScheme.backgroundColor collectionView.register(MDCBaseCell.self, forCellWithReuseIdentifier: baseCellIdentifier) collectionView.delegate = self collectionView.dataSource = self view.addSubview(collectionView) } func positionCollectionView() { var originX = view.bounds.origin.x var originY = view.bounds.origin.y var width = view.bounds.size.width var height = view.bounds.size.height if #available(iOS 11.0, *) { originX += view.safeAreaInsets.left originY += view.safeAreaInsets.top width -= (view.safeAreaInsets.left + view.safeAreaInsets.right) height -= (view.safeAreaInsets.top + view.safeAreaInsets.bottom) } let frame = CGRect(x: originX, y: originY, width: width, height: height); collectionView.frame = frame collectionViewLayout.estimatedItemSize = collectionViewEstimatedCellSize collectionViewLayout.invalidateLayout() collectionView.reloadData() } } extension BaseCellExample: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) { guard let cell = collectionView.cellForItem(at: indexPath) as? MDCBaseCell else { fatalError() } cell.elevation = ShadowElevation(rawValue: 10) } func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) { guard let cell = collectionView.cellForItem(at: indexPath) as? MDCBaseCell else { fatalError() } cell.elevation = ShadowElevation(rawValue: 0) } } extension BaseCellExample: UICollectionViewDataSource { func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return numberOfCells } static let colorNames: [String] = [ "Red", "Green", "Blue", "Orange", "Yellow", "Brown", "Cyan", "Purple" ] static let colorNameToColorMap: [String: UIColor] = [ "Red": .red, "Green": .green, "Blue": .blue, "Orange": .orange, "Yellow": .yellow, "Brown": .brown, "Cyan": .cyan, "Purple": .purple ] func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: baseCellIdentifier, for: indexPath) as? MDCBaseCell else { fatalError() } cell.layer.borderColor = containerScheme.colorScheme.onBackgroundColor.cgColor let styleIndex = indexPath.row % BaseCellExample.colorNames.count let colorName = BaseCellExample.colorNames[styleIndex] let backgroundColor = BaseCellExample.colorNameToColorMap[colorName] cell.accessibilityLabel = colorName cell.isAccessibilityElement = true cell.backgroundColor = backgroundColor cell.layer.borderWidth = 1 cell.inkColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1) return cell } } // MARK: Catalog By Convention extension BaseCellExample { @objc class func catalogMetadata() -> [String: Any] { return [ "breadcrumbs": ["List Items", "MDCBaseCell Example (Swift)"], "description": "MDCBaseCell Example (Swift)", "primaryDemo": true, "presentable": true, ] } }