blob: c67080f161b3e0fb014d061efe399fa843eaa87c [file] [log] [blame] [edit]
// 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 "MaterialTextFields.h"
#import <UIKit/UIKit.h>
@interface TextFieldStatesViewController : UIViewController
@property(nonatomic) Class selectedClass;
@property(nonatomic) NSArray<Class> *classes;
@property(nonatomic) id<MDCTextInputController> enabledController;
@property(nonatomic) MDCTextField *enabled;
@property(nonatomic) id<MDCTextInputController> disabledController;
@property(nonatomic) MDCTextField *disabled;
@property(nonatomic) id<MDCTextInputController> erroredController;
@property(nonatomic) MDCTextField *errored;
@property(nonatomic) id<MDCTextInputController> erroredDisabledController;
@property(nonatomic) MDCTextField *erroredDisabled;
@property(nonatomic) UIScrollView *scrollView;
@end
@implementation TextFieldStatesViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"Text Field States";
[self setupScrollView];
self.enabled = [[MDCTextField alloc] initWithFrame:CGRectZero];
self.enabled.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:self.enabled];
self.disabled = [[MDCTextField alloc] initWithFrame:CGRectZero];
self.disabled.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:self.disabled];
self.disabled.enabled = NO;
self.errored = [[MDCTextField alloc] initWithFrame:CGRectZero];
self.errored.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:self.errored];
self.erroredDisabled = [[MDCTextField alloc] initWithFrame:CGRectZero];
self.erroredDisabled.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:self.erroredDisabled];
self.erroredDisabled.enabled = NO;
[self setupControllers];
UIBarButtonItem *styleButton =
[[UIBarButtonItem alloc] initWithTitle:@"Style"
style:UIBarButtonItemStylePlain
target:self
action:@selector(styleButtonDidTouch:)];
self.navigationItem.rightBarButtonItem = styleButton;
[NSLayoutConstraint constraintWithItem:self.enabled
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeLeadingMargin
multiplier:1
constant:0]
.active = YES;
[NSLayoutConstraint constraintWithItem:self.enabled
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTrailingMargin
multiplier:1
constant:0]
.active = YES;
[NSLayoutConstraint constraintWithItem:self.enabled
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView
attribute:NSLayoutAttributeTrailingMargin
multiplier:1
constant:0]
.active = YES;
NSDictionary *views = @{
@"enabled" : self.enabled,
@"disabled" : self.disabled,
@"errored" : self.errored,
@"erroredDisabled" : self.erroredDisabled
};
[NSLayoutConstraint
activateConstraints:
[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[enabled]-[disabled]-[errored]-[erroredDisabled]"
options:NSLayoutFormatAlignAllLeading |
NSLayoutFormatAlignAllTrailing
metrics:nil
views:views]];
if (@available(iOS 11.0, *)) {
[NSLayoutConstraint constraintWithItem:self.enabled
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView.contentLayoutGuide
attribute:NSLayoutAttributeTop
multiplier:1
constant:20]
.active = YES;
[NSLayoutConstraint constraintWithItem:self.erroredDisabled
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView.contentLayoutGuide
attribute:NSLayoutAttributeBottomMargin
multiplier:1
constant:-20]
.active = YES;
} else {
[NSLayoutConstraint constraintWithItem:self.enabled
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView
attribute:NSLayoutAttributeTop
multiplier:1
constant:20]
.active = YES;
[NSLayoutConstraint constraintWithItem:self.erroredDisabled
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView
attribute:NSLayoutAttributeBottomMargin
multiplier:1
constant:-20]
.active = YES;
}
}
- (void)setupControllers {
if (!self.classes) {
// TODO: (larche) When more classes (other than full width) are added, put them in here so they
// can be showcased.
self.classes = @[
[MDCTextInputControllerFilled self], [MDCTextInputControllerOutlined self],
[MDCTextInputControllerUnderline self]
];
self.selectedClass = self.classes.firstObject;
}
if ([self.selectedClass conformsToProtocol:@protocol(MDCTextInputController)]) {
self.enabledController =
[(id<MDCTextInputController>)[self.selectedClass alloc] initWithTextInput:self.enabled];
self.enabledController.placeholderText = @"Enabled";
self.disabledController =
[(id<MDCTextInputController>)[self.selectedClass alloc] initWithTextInput:self.disabled];
self.disabledController.placeholderText = @"Disabled";
self.erroredController =
[(id<MDCTextInputController>)[self.selectedClass alloc] initWithTextInput:self.errored];
self.erroredController.placeholderText = @"Errored";
[self.erroredController setErrorText:@"Errored" errorAccessibilityValue:nil];
self.erroredDisabledController = [(id<MDCTextInputController>)[self.selectedClass alloc]
initWithTextInput:self.erroredDisabled];
self.erroredDisabledController.placeholderText = @"Errored Disabled";
[self.erroredDisabledController setErrorText:@"Errored Disabled" errorAccessibilityValue:nil];
}
}
- (void)setupScrollView {
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero];
self.scrollView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.scrollView];
self.scrollView.backgroundColor = UIColor.whiteColor;
[NSLayoutConstraint
activateConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|[scrollView]|"
options:0
metrics:nil
views:@{@"scrollView" : self.scrollView}]];
[NSLayoutConstraint
activateConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|[scrollView]|"
options:0
metrics:nil
views:@{@"scrollView" : self.scrollView}]];
CGFloat marginOffset = 16;
UIEdgeInsets margins = UIEdgeInsetsMake(0, marginOffset, 0, marginOffset);
self.scrollView.layoutMargins = margins;
UITapGestureRecognizer *tapRecognizer =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDidTouch)];
[self.view addGestureRecognizer:tapRecognizer];
}
- (void)tapDidTouch {
[self.view endEditing:YES];
}
- (void)styleButtonDidTouch:(UIBarButtonItem *)sender {
UIAlertController *alert =
[UIAlertController alertControllerWithTitle:@"Controller Class"
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
__weak TextFieldStatesViewController *weakSelf = self;
for (Class class in self.classes) {
NSString *title = NSStringFromClass(class);
title = [title stringByReplacingOccurrencesOfString:@"MDCTextInputController" withString:@""];
if ([class isEqual:self.selectedClass]) {
title = [title stringByAppendingString:@" ✓"];
}
UIAlertAction *action =
[UIAlertAction actionWithTitle:title
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *__unused _Nonnull unusedAction) {
weakSelf.selectedClass = class;
[weakSelf setupControllers];
}];
[alert addAction:action];
}
[self presentViewController:alert animated:YES completion:nil];
}
@end
@implementation TextFieldStatesViewController (CatalogByConvention)
+ (NSDictionary *)catalogMetadata {
return @{
@"breadcrumbs" : @[ @"Text Field", @"States" ],
@"primaryDemo" : @NO,
@"presentable" : @NO,
};
}
@end