blob: 1e599c8609b5a037bf0eeabc1fd6268b14215a29 [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 "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