blob: bd820d859236babf0018c1b3d95e213efa56e803 [file] [log] [blame] [edit]
// Copyright 2016-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>
#import "MDCItemBarAlignment.h"
// TODO(b/151929968): Delete import of delegate headers when client code has been migrated to no
// longer import delegates as transitive dependencies.
#import "MDCItemBarDelegate.h"
@class MDCItemBarStyle;
@class MDCTabBar;
@protocol MDCItemBarDelegate;
/**
A horizontally-scrollable list of tab-like items.
This is the private shared implementation of MDCTabBar and MDCBottomNavigationBar. It should not
be used directly and is not guaranteed to have a stable API.
*/
@interface MDCItemBar : UIView
/** Return the default height for the item bar given a style. */
+ (CGFloat)defaultHeightForStyle:(nonnull MDCItemBarStyle *)style;
/**
Link back to this item bar's owning MDCTabBar so it can interrogate the tab bar's size class
delegate for a horizontal size class.
@note This property may be removed in the near future.
*/
@property(nonatomic, weak, nullable) MDCTabBar *tabBar;
/**
Items displayed in the item bar.
The bar determines the newly-selected item using the following logic:
* Reselect the previously-selected item if it's still present in `items` after the update.
* If there was no selection previously or if the old selected item is gone, select the first item.
Clients that need empty selection to be preserved across updates to `items` must manually reset
selectedItem to nil after the update.
Changes to this property are not animated.
*/
@property(nonatomic, copy, nonnull) NSArray<UITabBarItem *> *items;
/**
The currently selected item. May be nil if `items` is empty.
Changes to `selectedItem` are not animated.
*/
@property(nonatomic, strong, nullable) UITabBarItem *selectedItem;
/** The item bar's delegate. */
@property(nonatomic, weak, nullable) id<MDCItemBarDelegate> delegate;
/**
Select an item with optional animation. Raises an NSInvalidArgumentException if selectedItem is
not in `items`.
*/
- (void)setSelectedItem:(nullable UITabBarItem *)selectedItem animated:(BOOL)animated;
/**
Horizontal alignment of items. Changes are not animated. Default alignment is
MDCItemBarAlignmentLeading.
*/
@property(nonatomic) MDCItemBarAlignment alignment;
/** Updates the alignment with optional animation. */
- (void)setAlignment:(MDCItemBarAlignment)alignment animated:(BOOL)animated;
#pragma mark - Styling
/** Updates the bar to use the given style properties. */
- (void)applyStyle:(nonnull MDCItemBarStyle *)itemStyle;
@end
#pragma mark -
/** Accessibility-related methods on MDCItemBar. */
@interface MDCItemBar (MDCItemBarAccessibility)
/**
* Get the accessibility element representing the given item. Returns nil if item is not in `items`
* or if the item is not on screen.
*
* The accessibility element returned from this method may be used as the focused element after a
* run loop iteration.
*/
- (nullable id)accessibilityElementForItem:(nonnull UITabBarItem *)item;
@end