// 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.MaterialBottomNavigation import MaterialComponents.MaterialColorScheme class BottomNavigationTitleVisibilityChangeExample: UIViewController, MDCBottomNavigationBarDelegate { @objc var colorScheme = MDCSemanticColorScheme(defaults: .material201804) let instructionLabel = UILabel() // Create a bottom navigation bar to add to a view. let bottomNavBar = MDCBottomNavigationBar() init() { super.init(nibName: nil, bundle: nil) } @available(*, unavailable) required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = colorScheme.backgroundColor view.addSubview(bottomNavBar) // Always show bottom navigation bar item titles. bottomNavBar.titleVisibility = .always // Cluster and center the bottom navigation bar items. bottomNavBar.alignment = .centered // Add items to the bottom navigation bar. let tabBarItem1 = UITabBarItem( title: "Home", image: UIImage(named: "system_icons/home"), tag: 0) let tabBarItem2 = UITabBarItem(title: "Messages", image: UIImage(named: "system_icons/email"), tag: 1) let tabBarItem3 = UITabBarItem(title: "Favorites", image: UIImage(named: "system_icons/favorite"), tag: 2) bottomNavBar.items = [tabBarItem1, tabBarItem2, tabBarItem3] // Select a bottom navigation bar item. bottomNavBar.selectedItem = tabBarItem2 bottomNavBar.delegate = self addInstructionLabel() } func layoutBottomNavBar() { let size = bottomNavBar.sizeThatFits(view.bounds.size) var bottomNavBarFrame = CGRect( x: 0, y: view.bounds.height - size.height, width: size.width, height: size.height) bottomNavBarFrame.size.height += view.safeAreaInsets.bottom bottomNavBarFrame.origin.y -= view.safeAreaInsets.bottom bottomNavBar.frame = bottomNavBarFrame } func addInstructionLabel() { instructionLabel.numberOfLines = 0 instructionLabel.textAlignment = .center instructionLabel.lineBreakMode = .byWordWrapping instructionLabel.text = "Choose the Home tab to make all titles disappear, and any other tab to make them reappear." view.addSubview(instructionLabel) } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() var viewBounds = view.bounds viewBounds = viewBounds.inset(by: view.safeAreaInsets) let labelWidth = min(viewBounds.size.width - 32, 480) let labelSize = instructionLabel.sizeThatFits( CGSize( width: labelWidth, height: viewBounds.size.height)) instructionLabel.bounds = CGRect(x: 0, y: 0, width: labelSize.width, height: labelSize.height) instructionLabel.center = CGPoint(x: viewBounds.midX, y: viewBounds.midY) layoutBottomNavBar() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: animated) } func bottomNavigationBar( _ bottomNavigationBar: MDCBottomNavigationBar, didSelect item: UITabBarItem ) { if item == bottomNavigationBar.items[0] { bottomNavigationBar.titleVisibility = .never } else { bottomNavigationBar.titleVisibility = .always } } } // MARK: Catalog by convention extension BottomNavigationTitleVisibilityChangeExample { @objc class func catalogMetadata() -> [String: Any] { return [ "breadcrumbs": ["Bottom Navigation", "Bottom Navigation Title Visibility (Swift)"], "primaryDemo": false, "presentable": false, ] } }