// Copyright 2017-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 #import "MaterialBottomNavigation.h" #import "MDCBottomNavigationBar+MaterialTheming.h" #import "MaterialPalettes.h" #import "MaterialColorScheme.h" #import "MaterialContainerScheme.h" @interface BottomNavigationTypicalUseExample : UIViewController @property(nonatomic, strong) id containerScheme; @property(nonatomic, assign) int badgeCount; @property(nonatomic, strong) MDCBottomNavigationBar *bottomNavBar; @end @implementation BottomNavigationTypicalUseExample - (id)init { self = [super init]; if (self) { self.title = @"Bottom Navigation"; _containerScheme = [[MDCContainerScheme alloc] init]; } return self; } - (void)commonBottomNavigationTypicalUseExampleViewDidLoad { self.bottomNavBar = [[MDCBottomNavigationBar alloc] initWithFrame:CGRectZero]; self.bottomNavBar.titleVisibility = MDCBottomNavigationBarTitleVisibilitySelected; self.bottomNavBar.alignment = MDCBottomNavigationBarAlignmentJustifiedAdjacentTitles; self.bottomNavBar.delegate = self; [self.view addSubview:self.bottomNavBar]; UITabBarItem *tabBarItem1 = [[UITabBarItem alloc] initWithTitle:@"Home" image:[UIImage imageNamed:@"ic_home"] tag:0]; UITabBarItem *tabBarItem2 = [[UITabBarItem alloc] initWithTitle:@"Messages" image:[UIImage imageNamed:@"ic_email"] tag:0]; tabBarItem2.badgeValue = @"8"; UITabBarItem *tabBarItem3 = [[UITabBarItem alloc] initWithTitle:@"Favorites" image:[UIImage imageNamed:@"ic_favorite"] tag:0]; tabBarItem3.badgeValue = @""; UITabBarItem *tabBarItem4 = [[UITabBarItem alloc] initWithTitle:@"Reader" image:[UIImage imageNamed:@"baseline_chrome_reader_mode_black_24pt" inBundle:[NSBundle bundleForClass: [BottomNavigationTypicalUseExample class]] compatibleWithTraitCollection:nil] tag:0]; tabBarItem4.badgeValue = @"88"; UITabBarItem *tabBarItem5 = [[UITabBarItem alloc] initWithTitle:@"Birthday" image:[UIImage imageNamed:@"ic_cake"] tag:0]; tabBarItem5.badgeValue = @"888+"; if ([tabBarItem5 respondsToSelector:@selector(badgeColor)]) { tabBarItem5.badgeColor = [MDCPalette cyanPalette].accent700; } self.bottomNavBar.items = @[ tabBarItem1, tabBarItem2, tabBarItem3, tabBarItem4, tabBarItem5 ]; self.bottomNavBar.selectedItem = tabBarItem2; if (@available(iOS 11.0, *)) { [self.bottomNavBar.barItemsBottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor] .active = YES; } self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"+Message" style:UIBarButtonItemStylePlain target:self action:@selector(updateBadgeItemCount)]; self.navigationItem.rightBarButtonItem.accessibilityLabel = @"Add a message"; self.navigationItem.rightBarButtonItem.accessibilityHint = @"Increases the badge on the \"Messages\" tab."; self.navigationItem.rightBarButtonItem.accessibilityIdentifier = @"messages-increment-badge"; } - (void)layoutBottomNavBar { CGRect viewBounds = CGRectStandardize(self.view.bounds); CGSize size = [self.bottomNavBar sizeThatFits:viewBounds.size]; UIEdgeInsets safeAreaInsets = UIEdgeInsetsZero; // Extend the Bottom Navigation to the bottom of the screen. if (@available(iOS 11.0, *)) { safeAreaInsets = self.view.safeAreaInsets; } CGRect bottomNavBarFrame = CGRectMake(0, viewBounds.size.height - size.height - safeAreaInsets.bottom, size.width, size.height + safeAreaInsets.bottom); self.bottomNavBar.frame = bottomNavBarFrame; } - (void)viewDidLoad { [super viewDidLoad]; [self commonBottomNavigationTypicalUseExampleViewDidLoad]; [self.bottomNavBar applyPrimaryThemeWithScheme:self.containerScheme]; self.view.backgroundColor = self.containerScheme.colorScheme.backgroundColor; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self layoutBottomNavBar]; } - (void)viewSafeAreaInsetsDidChange { if (@available(iOS 11.0, *)) { [super viewSafeAreaInsetsDidChange]; } [self layoutBottomNavBar]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } - (void)updateBadgeItemCount { // Example of badge with increasing count. if (!self.badgeCount) { self.badgeCount = 0; } self.badgeCount++; self.bottomNavBar.items[1].badgeValue = [NSNumber numberWithInt:self.badgeCount].stringValue; } #pragma mark - MDCBottomNavigationBarDelegate - (void)bottomNavigationBar:(nonnull MDCBottomNavigationBar *)bottomNavigationBar didSelectItem:(nonnull UITabBarItem *)item { NSLog(@"Selected Item: %@", item.title); } @end @implementation BottomNavigationTypicalUseExample (CatalogByConvention) + (NSDictionary *)catalogMetadata { return @{ @"breadcrumbs" : @[ @"Bottom Navigation", @"Bottom Navigation" ], @"description" : @"Bottom navigation bars allow movement between primary destinations in " @"an app.", @"primaryDemo" : @YES, @"presentable" : @YES, }; } @end @implementation BottomNavigationTypicalUseExample (SnapshotTestingByConvention) - (void)testDefaults { // Given MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; self.containerScheme = containerScheme; // When [self.bottomNavBar applyPrimaryThemeWithScheme:self.containerScheme]; } - (void)testDynamic201907ColorScheme { // Given MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; containerScheme.colorScheme = [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; self.containerScheme = containerScheme; // When [self.bottomNavBar applyPrimaryThemeWithScheme:self.containerScheme]; } - (void)testSmallerBarHeight { // When self.bottomNavBar.barHeight = 44; [self.bottomNavBar setNeedsLayout]; } @end