| // 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 Foundation |
| import MaterialComponents.MaterialAppBar |
| import MaterialComponents.MaterialAppBar_Theming |
| import MaterialComponents.MaterialContainerScheme |
| |
| class AppBarNavigationControllerExampleViewController: |
| UIViewController, |
| MDCAppBarNavigationControllerDelegate { |
| |
| @objc var containerScheme: MDCContainerScheming = MDCContainerScheme() |
| |
| init() { |
| super.init(nibName: nil, bundle: nil) |
| |
| self.title = "Navigation Controller" |
| } |
| |
| required init?(coder aDecoder: NSCoder) { |
| super.init(coder: aDecoder) |
| } |
| |
| override func viewDidLoad() { |
| super.viewDidLoad() |
| |
| self.view.backgroundColor = self.containerScheme.colorScheme.backgroundColor |
| |
| self.navigationItem.rightBarButtonItem = |
| UIBarButtonItem(title: "Present", |
| style: .done, |
| target: self, |
| action: #selector(presentModalAnimated)) |
| } |
| |
| @objc func presentModalAnimated() { |
| presentModal(animated: true) |
| } |
| |
| func presentModal(animated: Bool) { |
| let contentViewController = PresentedViewController() |
| let navigationController = MDCAppBarNavigationController() |
| navigationController.shouldSetNavigationBarHiddenHideAppBar = true |
| navigationController.delegate = self |
| navigationController.pushViewController(contentViewController, animated: false) |
| |
| contentViewController.navigationItem.rightBarButtonItem = |
| UIBarButtonItem(title: "Dismiss", |
| style: .done, |
| target: self, |
| action: #selector(dismissModal)) |
| |
| // Explicitly use the full-screen style to validate safe area insets behavior. |
| navigationController.modalPresentationStyle = .fullScreen |
| |
| self.present(navigationController, animated: animated, completion: nil) |
| } |
| |
| @objc func dismissModal() { |
| dismiss(animated: true) |
| } |
| |
| // MARK: - MDCAppBarNavigationControllerDelegate |
| |
| func appBarNavigationController(_ navigationController: MDCAppBarNavigationController, |
| willAdd appBarViewController: MDCAppBarViewController, |
| asChildOf viewController: UIViewController) { |
| appBarViewController.applyPrimaryTheme(withScheme: self.containerScheme) |
| } |
| } |
| |
| private class PresentedViewController: UITableViewController { |
| |
| init() { |
| super.init(nibName: nil, bundle: nil) |
| |
| self.title = "Presented" |
| |
| self.navigationItem.leftBarButtonItem = |
| UIBarButtonItem(title: "Toggle", |
| style: .done, |
| target: self, |
| action: #selector(toggleVisibility)) |
| } |
| |
| required init?(coder aDecoder: NSCoder) { |
| super.init(coder: aDecoder) |
| } |
| |
| // MARK - Actions |
| |
| @objc func toggleVisibility() { |
| guard let navigationController = navigationController else { |
| return |
| } |
| navigationController.setNavigationBarHidden(!navigationController.isNavigationBarHidden, |
| animated: true) |
| } |
| |
| // MARK: - UITableViewDataSource |
| |
| override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
| return 50 |
| } |
| |
| override func tableView(_ tableView: UITableView, |
| cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
| |
| return self.tableView.dequeueReusableCell(withIdentifier: "cell") ?? |
| UITableViewCell(style: .default, reuseIdentifier: "cell") |
| } |
| |
| // MARK - UITableViewDelegate |
| |
| override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
| toggleVisibility() |
| |
| tableView.deselectRow(at: indexPath, animated: true) |
| } |
| } |
| |
| // MARK: Catalog by convention |
| extension AppBarNavigationControllerExampleViewController { |
| |
| @objc class func catalogMetadata() -> [String: Any] { |
| return [ |
| "breadcrumbs": ["App Bar", "Navigation Controller"], |
| "primaryDemo": false, |
| "presentable": true, |
| ] |
| } |
| } |
| |
| // MARK: Snapshot testing by convention |
| extension AppBarNavigationControllerExampleViewController { |
| |
| @objc func testPresented() { |
| presentModal(animated: false) |
| } |
| } |