mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-02-20 08:27:32 +08:00
114 lines
4.3 KiB
Swift
114 lines
4.3 KiB
Swift
// Copyright 2019-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 UIKit
|
|
import MaterialComponents.MaterialTabs_TabBarView
|
|
import MaterialComponents.MaterialContainerScheme
|
|
|
|
class TabBarViewExample: UIViewController {
|
|
|
|
static let title = "TabBarView (Swift)"
|
|
|
|
@objc var containerScheme: MDCContainerScheming = MDCContainerScheme()
|
|
|
|
lazy var tabBar: MDCTabBarView = {
|
|
let tabBar = MDCTabBarView()
|
|
tabBar.items = self.tabBarItems
|
|
tabBar.tabBarDelegate = self
|
|
tabBar.translatesAutoresizingMaskIntoConstraints = false
|
|
return tabBar
|
|
}()
|
|
|
|
let itemIcons = [
|
|
UIImage(named: "system_icons/home")?.withRenderingMode(.alwaysTemplate),
|
|
UIImage(named: "system_icons/favorite")?.withRenderingMode(.alwaysTemplate),
|
|
UIImage(named: "system_icons/cake")?.withRenderingMode(.alwaysTemplate),
|
|
UIImage(named: "system_icons/email")?.withRenderingMode(.alwaysTemplate),
|
|
UIImage(named: "system_icons/search")?.withRenderingMode(.alwaysTemplate),
|
|
]
|
|
|
|
let itemTitles = ["Home", "Unselectable", "Cake", "Email", "Search"]
|
|
|
|
lazy var tabBarItems: [UITabBarItem] = {
|
|
return zip(itemTitles, itemIcons)
|
|
.enumerated()
|
|
.map { (index, titleIconPair) in
|
|
let (title, icon) = titleIconPair
|
|
return UITabBarItem(title: title, image: icon, tag: index)
|
|
}
|
|
}()
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
title = TabBarViewExample.title
|
|
|
|
applyFixForInjectedAppBar()
|
|
|
|
view.backgroundColor = containerScheme.colorScheme.backgroundColor
|
|
view.addSubview(tabBar)
|
|
view.layoutMarginsGuide.topAnchor.constraint(equalTo: tabBar.topAnchor).isActive = true
|
|
view.leadingAnchor.constraint(equalTo: tabBar.leadingAnchor).isActive = true
|
|
view.trailingAnchor.constraint(equalTo: tabBar.trailingAnchor).isActive = true
|
|
|
|
applyThemingToTabBarView()
|
|
}
|
|
|
|
// MARK: Private
|
|
|
|
private func applyThemingToTabBarView() {
|
|
tabBar.barTintColor = containerScheme.colorScheme.surfaceColor
|
|
tabBar.setTitleColor(
|
|
containerScheme.colorScheme.onSurfaceColor.withAlphaComponent(0.6),
|
|
for: .normal)
|
|
tabBar.setTitleColor(containerScheme.colorScheme.primaryColor, for: .selected)
|
|
tabBar.setImageTintColor(containerScheme.colorScheme.onSurfaceColor, for: .normal)
|
|
tabBar.setImageTintColor(containerScheme.colorScheme.primaryColor, for: .selected)
|
|
tabBar.setTitleFont(containerScheme.typographyScheme.button, for: .normal)
|
|
tabBar.setTitleFont(.systemFont(ofSize: 16), for: .selected)
|
|
tabBar.selectionIndicatorStrokeColor = containerScheme.colorScheme.primaryColor
|
|
tabBar.rippleColor = containerScheme.colorScheme.primaryColor.withAlphaComponent(0.1)
|
|
tabBar.bottomDividerColor = containerScheme.colorScheme.onSurfaceColor.withAlphaComponent(0.12)
|
|
}
|
|
|
|
private func applyFixForInjectedAppBar() {
|
|
// The injected AppBar has a bug where it will attempt to manipulate the Tab bar. To prevent
|
|
// that bug, we need to inject a scroll view into the view hierarchy before the tab bar. The App
|
|
// Bar will manipulate with that one instead.
|
|
let bugFixScrollView = UIScrollView()
|
|
bugFixScrollView.isUserInteractionEnabled = false
|
|
bugFixScrollView.isHidden = true
|
|
view.addSubview(bugFixScrollView)
|
|
}
|
|
}
|
|
|
|
extension TabBarViewExample: MDCTabBarViewDelegate {
|
|
func tabBarView(_ tabBarView: MDCTabBarView, shouldSelect item: UITabBarItem) -> Bool {
|
|
return tabBar.items.index(of: item) != 1
|
|
}
|
|
|
|
func tabBarView(_ tabBarView: MDCTabBarView, didSelect item: UITabBarItem) {
|
|
print("Item \(item.title!) was selected.")
|
|
}
|
|
}
|
|
|
|
extension TabBarViewExample {
|
|
@objc class func catalogMetadata() -> [String: Any] {
|
|
return [
|
|
"breadcrumbs": ["Tab Bar", TabBarViewExample.title],
|
|
"primaryDemo": false,
|
|
"presentable": false,
|
|
]
|
|
}
|
|
}
|