blob: 8add1bfb35247524412819b410c3a88ad5811cd7 [file] [log] [blame] [edit]
// 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")
}
}