mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-01-22 05:02:22 +08:00
Note that this new example demonstrates a bug in which the AppBar is not, in fact, hidden when presented. PiperOrigin-RevId: 311104930
153 lines
4.6 KiB
Swift
153 lines
4.6 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 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)
|
|
}
|
|
}
|