blob: 0af8b87b964928af364e32c8bda88d7177d9b318 [file] [log] [blame] [edit]
// 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 <UIKit/UIKit.h>
@class MDCAppBar;
@class MDCAppBarViewController;
@class MDCAppBarNavigationController;
/**
Defines the events that an MDCAppBarNavigationController may send to a delegate.
*/
@protocol MDCAppBarNavigationControllerDelegate <UINavigationControllerDelegate>
@optional
/**
Informs the receiver that the given App Bar will be added as a child of the given view controller.
This event is primarily intended to allow any configuration or theming of the App Bar to occur
before it becomes part of the view controller hierarchy.
By the time this event has fired, the navigation controller will already have attempted to infer
the tracking scroll view from the provided view controller.
@note This method will only be invoked if a new App Bar instance is about to be added to the view
controller. If a flexible header is already present in the view controller, this method will not
be invoked.
*/
- (void)appBarNavigationController:(nonnull MDCAppBarNavigationController *)navigationController
willAddAppBarViewController:(nonnull MDCAppBarViewController *)appBarViewController
asChildOfViewController:(nonnull UIViewController *)viewController;
#pragma mark - Will be deprecated
/**
Informs the receiver that the given App Bar will be added as a child of the given view controller.
This event is primarily intended to allow any configuration or theming of the App Bar to occur
before it becomes part of the view controller hierarchy.
By the time this event has fired, the navigation controller will already have attempted to infer
the tracking scroll view from the provided view controller.
@note This method will only be invoked if a new App Bar instance is about to be added to the view
controller. If a flexible header is already present in the view controller, this method will not
be invoked.
@warning This method will soon be deprecated. Please use
-appBarNavigationController:willAddAppBarViewController:asChildOfViewController: instead. Learn
more at
https://github.com/material-components/material-components-ios/blob/develop/components/AppBar/docs/migration-guide-appbar-appbarviewcontroller.md
*/
- (void)appBarNavigationController:(nonnull MDCAppBarNavigationController *)navigationController
willAddAppBar:(nonnull MDCAppBar *)appBar
asChildOfViewController:(nonnull UIViewController *)viewController;
@end
/**
A custom navigation controller instance that auto-injects App Bar instances into pushed view
controllers.
If a pushed view controller already has an App Bar or a Flexible Header then the navigation
controller will not inject a new App Bar.
To theme the injected App Bar, implement the delegate's
-appBarNavigationController:willAddAppBar:asChildOfViewController: API.
@note If you use the initWithRootViewController: API you will not have been able to provide a
delegate yet. In this case, use the -appBarForViewController: API to retrieve the injected App Bar
for your root view controller and execute your delegate logic on the returned result, if any.
*/
__attribute__((objc_subclassing_restricted)) @interface MDCAppBarNavigationController
: UINavigationController
#pragma mark - Reacting to state changes
/**
An extension of the UINavigationController's delegate.
*/
@property(nonatomic, weak, nullable) id<MDCAppBarNavigationControllerDelegate> delegate;
#pragma mark - Getting App Bar view controller instances
/**
Returns the injected App Bar view controller for a given view controller, if an App Bar was
injected.
*/
- (nullable MDCAppBarViewController *)appBarViewControllerForViewController:
(nonnull UIViewController *)viewController;
@end
@interface MDCAppBarNavigationController (ToBeDeprecated)
/**
Returns the injected App Bar for a given view controller, if an App Bar was injected.
@warning This method will eventually be deprecated. Use -appBarViewControllerForViewController:
instead. Learn more at
https://github.com/material-components/material-components-ios/blob/develop/components/AppBar/docs/migration-guide-appbar-appbarviewcontroller.md
*/
- (nullable MDCAppBar *)appBarForViewController:(nonnull UIViewController *)viewController;
@end