// Copyright 2020-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.MaterialNavigationBar_ColorThemer import MaterialComponents.MaterialNavigationBar open class NavigationBarAlertExample: UIViewController { let navBar = MDCNavigationBar() @objc var colorScheme = MDCSemanticColorScheme(defaults: .material201907) let exampleView = ExampleInstructionsViewNavigationBarTypicalUseSwift() open override func viewDidLoad() { super.viewDidLoad() title = "Navigation Bar" navBar.observe(navigationItem) view.backgroundColor = colorScheme.backgroundColor view.addSubview(navBar) MDCNavigationBarColorThemer.applySemanticColorScheme(colorScheme, to: navBar) navBar.translatesAutoresizingMaskIntoConstraints = false if #available(iOS 11.0, *) { self.view.safeAreaLayoutGuide.topAnchor.constraint(equalTo: self.navBar.topAnchor).isActive = true } else { NSLayoutConstraint( item: self.topLayoutGuide, attribute: .bottom, relatedBy: .equal, toItem: self.navBar, attribute: .top, multiplier: 1, constant: 0 ).isActive = true } let viewBindings = ["navBar": navBar] NSLayoutConstraint.activate( NSLayoutConstraint.constraints( withVisualFormat: "H:|[navBar]|", options: [], metrics: nil, views: viewBindings)) navigationItem.rightBarButtonItem = UIBarButtonItem( title: "Show alert", style: .plain, target: self, action: #selector(showPopoverAlert(_:))) } override open func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: animated) } @objc func showPopoverAlert(_ sender: UIBarButtonItem) { let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) alertController.modalPresentationStyle = .popover alertController.popoverPresentationController?.sourceView = navBar alertController.popoverPresentationController?.sourceRect = navBar.rect( forTrailing: sender, in: navBar) alertController.addAction( UIAlertAction(title: "Sample action 1", style: .default, handler: nil)) alertController.addAction( UIAlertAction(title: "Sample action 2", style: .default, handler: nil)) alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) present(alertController, animated: true, completion: nil) } } // MARK: - CatalogByConvention extension NavigationBarAlertExample { @objc class func catalogMetadata() -> [String: Any] { return [ "breadcrumbs": ["Navigation Bar", "Popover Alert"], "primaryDemo": false, "presentable": false, ] } @objc func catalogShouldHideNavigation() -> Bool { return true } } // MARK: - SnapshotTestingByConvention extension NavigationBarAlertExample { @objc func testAlertIsAnchoredOverBarButton() { showPopoverAlert(navigationItem.rightBarButtonItem!) } }