| // 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 "supplemental/TabBarIconExampleSupplemental.h" |
| |
| #import "MaterialAppBar+ColorThemer.h" |
| #import "MaterialAppBar.h" |
| #import "MaterialButtons.h" |
| #import "MaterialHeaderStackView.h" |
| #import "MaterialTabs.h" |
| #import "MaterialTabs+Theming.h" |
| #import "MaterialColorScheme.h" |
| #import "MaterialContainerScheme.h" |
| |
| @interface TabBarIconExample () |
| @property(nonatomic, strong) UIBarButtonItem *addStarButtonItem; |
| @end |
| |
| @implementation TabBarIconExample |
| |
| - (id)init { |
| self = [super init]; |
| if (self) { |
| _containerScheme = [[MDCContainerScheme alloc] init]; |
| } |
| return self; |
| } |
| |
| - (void)viewDidLoad { |
| [super viewDidLoad]; |
| |
| [self setupExampleViews]; |
| |
| [self loadTabBar]; |
| |
| self.addStarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Add" |
| style:UIBarButtonItemStylePlain |
| target:self |
| action:@selector(incrementDidTouch:)]; |
| } |
| |
| #pragma mark - Action |
| |
| - (void)incrementDidTouch:(id)sender { |
| [self incrementStarBadge]; |
| |
| [self addStarCentered:NO]; |
| } |
| |
| - (void)incrementStarBadge { |
| // Increment numeric badge value. |
| UITabBarItem *starItem = self.tabBar.items[1]; |
| NSString *badgeValue = starItem.badgeValue; |
| if (badgeValue) { |
| NSInteger badgeNumber = badgeValue.integerValue; |
| if (badgeNumber > 0) { |
| // Update badge value directly - the cell should update immediately. |
| starItem.badgeValue = [NSNumberFormatter localizedStringFromNumber:@(badgeNumber + 1) |
| numberStyle:NSNumberFormatterNoStyle]; |
| } |
| } |
| } |
| |
| #pragma mark - Private |
| |
| - (void)loadTabBar { |
| MDCTabBar *tabBar = [[MDCTabBar alloc] init]; |
| tabBar.delegate = self; |
| tabBar.alignment = MDCTabBarAlignmentCenterSelected; |
| |
| NSBundle *bundle = [NSBundle bundleForClass:[TabBarIconExample class]]; |
| UIImage *infoImage = [UIImage imageNamed:@"TabBarDemo_ic_info" |
| inBundle:bundle |
| compatibleWithTraitCollection:nil]; |
| UIImage *starImage = [UIImage imageNamed:@"TabBarDemo_ic_star" |
| inBundle:bundle |
| compatibleWithTraitCollection:nil]; |
| tabBar.items = @[ |
| [[UITabBarItem alloc] initWithTitle:@"Info" image:infoImage tag:0], |
| [[UITabBarItem alloc] initWithTitle:@"Stars" image:starImage tag:0] |
| ]; |
| |
| // Give the second item a badge |
| [tabBar.items[1] setBadgeValue:@"1"]; |
| |
| [tabBar applyPrimaryThemeWithScheme:self.containerScheme]; |
| |
| tabBar.inkColor = [[UIColor whiteColor] colorWithAlphaComponent:(CGFloat)0.1]; |
| tabBar.itemAppearance = MDCTabBarItemAppearanceTitledImages; |
| |
| self.tabBar = tabBar; |
| self.appBarViewController.headerStackView.bottomBar = self.tabBar; |
| [self.appBarViewController.headerStackView setNeedsLayout]; |
| } |
| |
| - (void)changeAlignment:(id)sender { |
| UIAlertController *sheet = |
| [UIAlertController alertControllerWithTitle:nil |
| message:nil |
| preferredStyle:UIAlertControllerStyleActionSheet]; |
| sheet.popoverPresentationController.sourceView = self.alignmentButton; |
| sheet.popoverPresentationController.sourceRect = self.alignmentButton.bounds; |
| [sheet addAction:[UIAlertAction actionWithTitle:@"Leading" |
| style:UIAlertActionStyleDefault |
| handler:^(UIAlertAction *_Nonnull action) { |
| [self setAlignment:MDCTabBarAlignmentLeading]; |
| }]]; |
| [sheet addAction:[UIAlertAction actionWithTitle:@"Center" |
| style:UIAlertActionStyleDefault |
| handler:^(UIAlertAction *_Nonnull action) { |
| [self setAlignment:MDCTabBarAlignmentCenter]; |
| }]]; |
| [sheet addAction:[UIAlertAction actionWithTitle:@"Justified" |
| style:UIAlertActionStyleDefault |
| handler:^(UIAlertAction *_Nonnull action) { |
| [self setAlignment:MDCTabBarAlignmentJustified]; |
| }]]; |
| [sheet addAction:[UIAlertAction actionWithTitle:@"Selected Center" |
| style:UIAlertActionStyleDefault |
| handler:^(UIAlertAction *_Nonnull action) { |
| [self setAlignment:MDCTabBarAlignmentCenterSelected]; |
| }]]; |
| [self presentViewController:sheet animated:YES completion:nil]; |
| } |
| |
| - (void)setAlignment:(MDCTabBarAlignment)alignment { |
| [self.tabBar setAlignment:alignment animated:YES]; |
| } |
| |
| #pragma mark - MDCTabBarDelegate |
| |
| - (void)tabBar:(MDCTabBar *)tabBar didSelectItem:(UITabBarItem *)item { |
| NSUInteger index = [tabBar.items indexOfObject:item]; |
| NSAssert(index != NSNotFound, @"The MDCTabBar does not contain the expected UITabBarItem."); |
| |
| [self.scrollView setContentOffset:CGPointMake(index * CGRectGetWidth(self.view.bounds), 0) |
| animated:YES]; |
| if (index == 0) { |
| self.navigationItem.rightBarButtonItem = nil; |
| } else { |
| self.navigationItem.rightBarButtonItem = self.addStarButtonItem; |
| } |
| } |
| |
| @end |
| |
| @implementation TabBarIconExample (SnapshotTestingByConvention) |
| |
| - (void)testDefaults { |
| // Given |
| MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; |
| self.containerScheme = containerScheme; |
| |
| // When |
| [self.tabBar applyPrimaryThemeWithScheme:self.containerScheme]; |
| } |
| |
| - (void)testDynamic201907ColorScheme { |
| // Given |
| MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; |
| containerScheme.colorScheme = |
| [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; |
| self.containerScheme = containerScheme; |
| |
| // When |
| [self.tabBar applyPrimaryThemeWithScheme:self.containerScheme]; |
| [MDCAppBarColorThemer applyColorScheme:self.containerScheme.colorScheme |
| toAppBarViewController:self.appBarViewController]; |
| } |
| |
| @end |