Skip to content

Commit

Permalink
[Tabs] Allow setting selected item without animation. (#7749)
Browse files Browse the repository at this point in the history
The property setter will automatically animate setting the selected item. For
some use cases, like tests or configuring a view for the first time, it's
useful to set the selected item without animation.

Part of #7744
  • Loading branch information
Robert Moore committed Jun 28, 2019
1 parent c3fe63e commit 8d82d5e
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 24 deletions.
2 changes: 1 addition & 1 deletion MaterialComponentsBeta.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ Pod::Spec.new do |mdc|
"components/#{extension.base_name.split('+')[0]}/src/#{extension.base_name.split('+')[1]}/*.{h,m}",
"components/#{extension.base_name.split('+')[0]}/src/#{extension.base_name.split('+')[1]}/private/*.{h,m}"
]
extension.dependency "MaterialComponents/#{extension.base_name.split('+')[0]}"
extension.dependency "MaterialComponents/Ripple"

extension.test_spec 'UnitTests' do |unit_tests|
unit_tests.source_files = [
Expand Down
4 changes: 3 additions & 1 deletion components/Tabs/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,9 @@ mdc_extension_objc_library(

mdc_extension_objc_library(
name = "TabBarView",
deps = ["//components/Ripple"],
deps = [
"//components/Ripple",
],
)

mdc_examples_objc_library(
Expand Down
3 changes: 3 additions & 0 deletions components/Tabs/src/TabBarView/MDCTabBarView.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ __attribute__((objc_subclassing_restricted)) @interface MDCTabBarView : UIScroll
/** The currently-selected item in the Tab bar. */
@property(nullable, nonatomic, strong) UITabBarItem *selectedItem;

/** Set the selected item with or without animation. */
- (void)setSelectedItem:(nullable UITabBarItem *)selectedItem animated:(BOOL)animated;

/** The color of the Tab bar's background. */
@property(nullable, nonatomic, copy) UIColor *barTintColor;

Expand Down
10 changes: 8 additions & 2 deletions components/Tabs/src/TabBarView/MDCTabBarView.m
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
#import "MDCTabBarViewDelegate.h"
#import "private/MDCTabBarViewItemView.h"

#import <CoreGraphics/CoreGraphics.h>

// KVO contexts
static char *const kKVOContextMDCTabBarView = "kKVOContextMDCTabBarView";

Expand Down Expand Up @@ -136,6 +138,10 @@ - (void)setItems:(NSArray<UITabBarItem *> *)items {
}

- (void)setSelectedItem:(UITabBarItem *)selectedItem {
[self setSelectedItem:selectedItem animated:YES];
}

- (void)setSelectedItem:(UITabBarItem *)selectedItem animated:(BOOL)animated {
if (self.selectedItem == selectedItem) {
return;
}
Expand Down Expand Up @@ -171,7 +177,7 @@ - (void)setSelectedItem:(UITabBarItem *)selectedItem {
CGRect itemFrameInScrollViewBounds =
[self convertRect:self.containerView.arrangedSubviews[itemIndex].frame
fromView:self.containerView];
[self scrollRectToVisible:itemFrameInScrollViewBounds animated:YES];
[self scrollRectToVisible:itemFrameInScrollViewBounds animated:animated];
}

- (void)updateImageTintColorForAllViews {
Expand Down Expand Up @@ -424,7 +430,7 @@ - (CGFloat)justifiedWidth {

- (void)scrollUntilSelectedItemIsVisibleWithoutAnimation {
NSUInteger index = [self.items indexOfObject:self.selectedItem];
if (index == NSNotFound || index > self.containerView.arrangedSubviews.count) {
if (index == NSNotFound || index >= self.containerView.arrangedSubviews.count) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ - (void)testItemsWithOnlyTitles {

// When
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// Then
[self generateSnapshotAndVerifyForView:self.tabBarView];
Expand All @@ -111,7 +111,7 @@ - (void)testItemsWithOnlyImages {

// When
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// Then
[self generateSnapshotAndVerifyForView:self.tabBarView];
Expand All @@ -126,7 +126,7 @@ - (void)testItemsWithTitlesAndImages {

// When
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// Then
[self generateSnapshotAndVerifyForView:self.tabBarView];
Expand All @@ -141,7 +141,7 @@ - (void)testItemsWithMixedTitlesAndImages {

// When
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// Then
[self generateSnapshotAndVerifyForView:self.tabBarView];
Expand All @@ -157,10 +157,10 @@ - (void)testChangingSelectedItemIgnoresSelectedImage {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon1 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon1 tag:5];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
self.tabBarView.selectedItem = item1;
[self.tabBarView setSelectedItem:item1 animated:NO];

// Then
[self generateSnapshotAndVerifyForView:self.tabBarView];
Expand All @@ -179,7 +179,7 @@ - (void)testSelectedItemInitiallyVisible {
self.tabBarView.items = @[ item1, item2, item3, item4, item5, item6 ];

// When
self.tabBarView.selectedItem = item5;
[self.tabBarView setSelectedItem:item5 animated:NO];

// Then
[self generateSnapshotAndVerifyForView:self.tabBarView];
Expand All @@ -194,7 +194,7 @@ - (void)testChangingTitleAfterAddingToBar {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon1 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon1 tag:5];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
item2.title = @"2";
Expand All @@ -210,7 +210,7 @@ - (void)testChangingImageOfUnselectedItemAfterAddingToBar {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon1 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon1 tag:5];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
item1.image = self.typicalIcon2;
Expand All @@ -226,7 +226,7 @@ - (void)testChangingImageOfSelectedItemAfterAddingToBar {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon1 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon1 tag:5];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
item2.image = self.typicalIcon2;
Expand All @@ -242,7 +242,7 @@ - (void)testChangingSelectedImageOfUnselectedItemAfterAddingToBarDoesNothing {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon1 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon1 tag:5];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
item1.selectedImage = self.typicalIcon2;
Expand All @@ -258,7 +258,7 @@ - (void)testChangingSelectedImageOfSelectedItemAfterAddingToBarDoesNothing {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon1 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon1 tag:5];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
item2.selectedImage = self.typicalIcon2;
Expand Down Expand Up @@ -394,7 +394,7 @@ - (void)testSetTitleColorForExplicitItemStates {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon2 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon3 tag:3];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
[self.tabBarView setTitleColor:UIColor.brownColor forState:UIControlStateSelected];
Expand All @@ -411,7 +411,8 @@ - (void)testSetTitleColorForNormalStateAppliesToSelectedItem {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon2 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon3 tag:3];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];
;

// When
[self.tabBarView setTitleColor:UIColor.purpleColor forState:UIControlStateNormal];
Expand All @@ -427,7 +428,7 @@ - (void)testSetTitleColorExplicitlyToNilRendersSomeDefault {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon2 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon3 tag:3];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
[self.tabBarView setTitleColor:nil forState:UIControlStateNormal];
Expand All @@ -444,7 +445,7 @@ - (void)testSetImageTintColorForExplicitItemStates {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon2 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon3 tag:3];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
[self.tabBarView setImageTintColor:UIColor.brownColor forState:UIControlStateSelected];
Expand All @@ -461,7 +462,7 @@ - (void)testSetImageTintColorForNormalStateAppliesToSelectedItem {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon2 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon3 tag:3];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
[self.tabBarView setImageTintColor:UIColor.purpleColor forState:UIControlStateNormal];
Expand All @@ -478,7 +479,7 @@ - (void)testSetImageTintColorExplicitlyToNilUsesTintColor {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon2 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon3 tag:3];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];

// When
[self.tabBarView setImageTintColor:nil forState:UIControlStateNormal];
Expand All @@ -495,14 +496,14 @@ - (void)testChangingSelectionUpdatesItemStyle {
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"Two" image:self.typicalIcon2 tag:2];
UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"Three" image:self.typicalIcon3 tag:3];
self.tabBarView.items = @[ item1, item2, item3 ];
self.tabBarView.selectedItem = item2;
[self.tabBarView setSelectedItem:item2 animated:NO];
[self.tabBarView setTitleColor:UIColor.purpleColor forState:UIControlStateNormal];
[self.tabBarView setImageTintColor:UIColor.redColor forState:UIControlStateNormal];
[self.tabBarView setTitleColor:UIColor.brownColor forState:UIControlStateSelected];
[self.tabBarView setImageTintColor:UIColor.blueColor forState:UIControlStateSelected];

// When
self.tabBarView.selectedItem = item3;
[self.tabBarView setSelectedItem:item3 animated:NO];

// Then
[self generateSnapshotAndVerifyForView:self.tabBarView];
Expand Down

0 comments on commit 8d82d5e

Please sign in to comment.