mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-02-20 08:27:32 +08:00
Provides accessibility labels and distinguishing colors for each cell. Voice Over users can now scroll the example. Closes #8898
152 lines
5.4 KiB
Swift
152 lines
5.4 KiB
Swift
// 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,
|
|
]
|
|
}
|
|
}
|