blob: a0982fc13f38dd14253dec7d26ea3571dfd282bf [file] [log] [blame]
// Copyright 2019-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 "MaterialButtons.h"
#import "MDCTextControlContentViewController.h"
#import "MaterialColorScheme.h"
#import "MaterialContainerScheme.h"
#import "MDCTextControlConfiguratorExample.h"
@interface MDCTextControlConfiguratorExample ()
/**
All the content size categories that this view controller supports.
*/
@property(nonatomic, strong) NSArray *contentSizeCategories;
@end
@implementation MDCTextControlConfiguratorExample
#pragma mark View Controller Lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
[self setUpChildViewController];
[self setUpContentSizeCategories];
[self setUpContainerScheme];
self.view.backgroundColor = self.containerScheme.colorScheme.backgroundColor;
}
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
CGFloat viewWidth = CGRectGetWidth(self.view.frame);
CGFloat viewHeight = CGRectGetHeight(self.view.frame);
self.contentViewController.view.frame =
CGRectMake(0, self.preferredContentMinY, viewWidth, viewHeight - self.preferredContentMinY);
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[self.contentViewController.view setNeedsLayout];
}
#pragma mark Setup
- (void)setUpChildViewController {
[self initializeContentViewController];
if (self.contentViewController) {
[self addChildViewController:self.contentViewController];
self.contentViewController.traitEnvironmentChangeDelegate = self;
[self.view addSubview:self.contentViewController.view];
}
}
- (void)initializeContentViewController {
}
- (void)setUpContainerScheme {
if (!self.containerScheme) {
MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init];
containerScheme.colorScheme =
[[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907];
self.containerScheme = containerScheme;
}
}
- (void)setUpContentSizeCategories {
self.contentSizeCategories = @[
UIContentSizeCategoryExtraSmall, UIContentSizeCategorySmall, UIContentSizeCategoryMedium,
UIContentSizeCategoryLarge, UIContentSizeCategoryExtraLarge,
UIContentSizeCategoryExtraExtraLarge, UIContentSizeCategoryExtraExtraExtraLarge,
UIContentSizeCategoryAccessibilityMedium, UIContentSizeCategoryAccessibilityLarge,
UIContentSizeCategoryAccessibilityExtraLarge, UIContentSizeCategoryAccessibilityExtraExtraLarge,
UIContentSizeCategoryAccessibilityExtraExtraExtraLarge
];
}
- (void)increaseContentSizeForChildViewController:(UIViewController *)childViewController
decreaseButton:(MDCButton *)decreaseButton
increaseButton:(MDCButton *)increaseButton {
UIContentSizeCategory contentSizeCategory =
[self contentSizeCategoryForViewController:childViewController];
if (contentSizeCategory) {
NSInteger idx = [self.contentSizeCategories indexOfObject:contentSizeCategory];
if (idx < (NSInteger)self.contentSizeCategories.count - 1) {
idx += 1;
UIContentSizeCategory newContentSizeCategory = self.contentSizeCategories[idx];
[self setContentSizeCategory:newContentSizeCategory
onChildViewController:childViewController];
increaseButton.enabled = idx != (NSInteger)self.contentSizeCategories.count - 1;
decreaseButton.enabled = idx > 0;
}
}
}
- (void)decreaseContentSizeForChildViewController:(UIViewController *)childViewController
decreaseButton:(MDCButton *)decreaseButton
increaseButton:(MDCButton *)increaseButton {
UIContentSizeCategory contentSizeCategory =
[self contentSizeCategoryForViewController:childViewController];
if (contentSizeCategory) {
NSInteger idx = [self.contentSizeCategories indexOfObject:contentSizeCategory];
if (idx > (NSInteger)0) {
idx -= 1;
UIContentSizeCategory newContentSizeCategory = self.contentSizeCategories[idx];
[self setContentSizeCategory:newContentSizeCategory
onChildViewController:childViewController];
increaseButton.enabled = idx != (NSInteger)self.contentSizeCategories.count - 1;
decreaseButton.enabled = idx > 0;
}
}
}
#pragma mark Accessors
- (void)setContentSizeCategory:(UIContentSizeCategory)contentSizeCategory
onChildViewController:(UIViewController *)viewController {
UITraitCollection *contentSizeCategoryTraitCollection =
[UITraitCollection traitCollectionWithPreferredContentSizeCategory:contentSizeCategory];
UITraitCollection *currentTraitCollection = viewController.traitCollection;
NSArray *traitCollections = @[ currentTraitCollection, contentSizeCategoryTraitCollection ];
UITraitCollection *traitCollection =
[UITraitCollection traitCollectionWithTraitsFromCollections:traitCollections];
[self setOverrideTraitCollection:traitCollection forChildViewController:viewController];
[self.view setNeedsLayout];
}
- (UIContentSizeCategory)contentSizeCategoryForViewController:(UIViewController *)viewController {
return viewController.traitCollection.preferredContentSizeCategory;
}
- (void)setContainerScheme:(id<MDCContainerScheming>)containerScheme {
self.contentViewController.containerScheme = containerScheme;
}
- (id<MDCContainerScheming>)containerScheme {
return self.contentViewController.containerScheme;
}
- (CGFloat)preferredContentMinY {
if (@available(iOS 11.0, *)) {
return (CGFloat)(self.view.safeAreaInsets.top);
} else {
return (CGFloat)self.topLayoutGuide.length;
}
}
- (void)setTraitCollection:(UITraitCollection *)traitCollection
onChildViewController:(UIViewController *)childViewController {
NSArray *traitCollections = @[ childViewController.traitCollection, traitCollection ];
UITraitCollection *newTraitCollection =
[UITraitCollection traitCollectionWithTraitsFromCollections:traitCollections];
[self setOverrideTraitCollection:newTraitCollection forChildViewController:childViewController];
}
#pragma mark - MDCTraitEnvironmentChangeDelegate
- (void)
childViewControllerDidRequestPreferredContentSizeCategoryDecrement:
(UIViewController *)childViewController
decreaseButton:(MDCButton *)decreaseButton
increaseButton:(MDCButton *)increaseButton {
[self decreaseContentSizeForChildViewController:childViewController
decreaseButton:decreaseButton
increaseButton:increaseButton];
}
- (void)
childViewControllerDidRequestPreferredContentSizeCategoryIncrement:
(UIViewController *)childViewController
decreaseButton:(MDCButton *)decreaseButton
increaseButton:(MDCButton *)increaseButton {
[self increaseContentSizeForChildViewController:childViewController
decreaseButton:decreaseButton
increaseButton:increaseButton];
}
- (void)childViewControllerDidRequestUserInterfaceStyle:(UIViewController *)childViewController
userInterfaceStyle:(UIUserInterfaceStyle)userInterfaceStyle
API_AVAILABLE(ios(12.0)) {
UITraitCollection *userInterfaceStyleTraitCollection =
[UITraitCollection traitCollectionWithUserInterfaceStyle:userInterfaceStyle];
[self setTraitCollection:userInterfaceStyleTraitCollection
onChildViewController:childViewController];
}
- (void)childViewControllerDidRequestLayoutDirection:(UIViewController *)childViewController
layoutDirection:
(UITraitEnvironmentLayoutDirection)layoutDirection
API_AVAILABLE(ios(10.0)) {
UITraitCollection *layoutDirectionTraitCollection =
[UITraitCollection traitCollectionWithLayoutDirection:layoutDirection];
[self setTraitCollection:layoutDirectionTraitCollection
onChildViewController:childViewController];
}
@end