mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-02-20 08:27:32 +08:00
135 lines
4.3 KiB
Swift
135 lines
4.3 KiB
Swift
// Copyright 2016-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 MaterialComponents.MaterialPalettes
|
|
import MDFTextAccessibility
|
|
|
|
/// Returns a high-contrast color for text against @c backgroundColor. If no such color can be found,
|
|
/// returns black.
|
|
///
|
|
/// @params backgroundColor the background color to use for contrast calculations.
|
|
///
|
|
/// @returns a color with sufficiently-high contrast against @c backgroundColor, else just returns
|
|
/// black.
|
|
func TextColorFor(backgroundColor: UIColor) -> UIColor {
|
|
if let safeColor = MDFTextAccessibility.textColor(
|
|
fromChoices: [.black, .white],
|
|
onBackgroundColor: backgroundColor,
|
|
options: [.enhancedContrast, .preferDarker])
|
|
{
|
|
return safeColor
|
|
} else if let safeColor = MDFTextAccessibility.textColor(
|
|
fromChoices: [.black, .white],
|
|
onBackgroundColor: backgroundColor,
|
|
options: .preferDarker)
|
|
{
|
|
return safeColor
|
|
}
|
|
return .black
|
|
}
|
|
|
|
typealias ExampleTone = (name: String, tone: UIColor)
|
|
|
|
func ExampleTonesForPalette(_ palette: MDCPalette) -> [ExampleTone] {
|
|
var tones: [ExampleTone] = [
|
|
(MDCPaletteTint.tint100Name.rawValue, palette.tint100),
|
|
(MDCPaletteTint.tint300Name.rawValue, palette.tint300),
|
|
(MDCPaletteTint.tint500Name.rawValue, palette.tint500),
|
|
(MDCPaletteTint.tint700Name.rawValue, palette.tint700),
|
|
]
|
|
|
|
if let accent = palette.accent400 {
|
|
tones.append((MDCPaletteAccent.accent400Name.rawValue, accent))
|
|
}
|
|
|
|
return tones
|
|
}
|
|
|
|
class PalettesExampleViewController: UITableViewController {
|
|
var palettes: [(name: String, palette: MDCPalette)] = []
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
self.tableView.separatorStyle = .none
|
|
self.tableView.rowHeight = UITableView.automaticDimension
|
|
self.tableView.estimatedRowHeight = 50
|
|
}
|
|
|
|
override func numberOfSections(in tableView: UITableView) -> Int {
|
|
return palettes.count
|
|
}
|
|
|
|
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|
let palette = palettes[section].palette
|
|
return ExampleTonesForPalette(palette).count
|
|
}
|
|
|
|
override func tableView(
|
|
_ tableView: UITableView,
|
|
cellForRowAt indexPath: IndexPath
|
|
) -> UITableViewCell {
|
|
let cell =
|
|
tableView.dequeueReusableCell(withIdentifier: "cell")
|
|
?? UITableViewCell(style: .default, reuseIdentifier: "cell")
|
|
let paletteInfo = palettes[indexPath.section]
|
|
let tones = ExampleTonesForPalette(paletteInfo.palette)
|
|
cell.textLabel?.text = tones[indexPath.row].name
|
|
cell.backgroundColor = tones[indexPath.row].tone
|
|
if let cellBackgroundColor = cell.backgroundColor {
|
|
cell.textLabel?.textColor = TextColorFor(backgroundColor: cellBackgroundColor)
|
|
}
|
|
cell.selectionStyle = .none
|
|
|
|
return cell
|
|
}
|
|
override func tableView(
|
|
_ tableView: UITableView, willDisplayHeaderView view: UIView,
|
|
forSection section: Int
|
|
) {
|
|
if let headerView = view as? UITableViewHeaderFooterView {
|
|
if let backgroundColor = headerView.backgroundColor != nil
|
|
? headerView.backgroundColor
|
|
: tableView.backgroundColor
|
|
{
|
|
headerView.textLabel?.textColor = TextColorFor(backgroundColor: backgroundColor)
|
|
} else {
|
|
headerView.textLabel?.textColor = .black
|
|
}
|
|
}
|
|
}
|
|
|
|
override func tableView(
|
|
_ tableView: UITableView,
|
|
titleForHeaderInSection section: Int
|
|
) -> String? {
|
|
return palettes[section].name
|
|
}
|
|
|
|
convenience init() {
|
|
self.init(style: .grouped)
|
|
}
|
|
|
|
override init(style: UITableView.Style) {
|
|
super.init(style: style)
|
|
}
|
|
|
|
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
|
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
|
}
|
|
|
|
required init?(coder aDecoder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
}
|