mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-02-20 08:27:32 +08:00
230 lines
8.6 KiB
Objective-C
230 lines
8.6 KiB
Objective-C
// Copyright 2020-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 "MDCTextControlTextAreaContentViewController.h"
|
|
|
|
#import "MDCTextControlContentViewController.h"
|
|
#import "MDCBaseTextArea.h"
|
|
#import "MaterialColorScheme.h"
|
|
#import "MaterialContainerScheme.h"
|
|
|
|
#import "MDCTextControlLabelBehavior.h"
|
|
#import "MDCFilledTextArea.h"
|
|
#import "MDCOutlinedTextArea.h"
|
|
#import "MDCOutlinedTextArea+MaterialTheming.h"
|
|
|
|
@interface MDCTextControlTextAreaContentViewController () <UITextViewDelegate>
|
|
@property(nonatomic, assign) BOOL shouldAddDebugBorder;
|
|
@property(nonatomic, assign) BOOL shouldAddDebugLeadingView;
|
|
@end
|
|
|
|
@implementation MDCTextControlTextAreaContentViewController
|
|
|
|
#pragma mark Setup
|
|
|
|
- (MDCFilledTextArea *)createMaterialFilledTextArea {
|
|
MDCFilledTextArea *textArea = [[MDCFilledTextArea alloc] init];
|
|
textArea.textView.delegate = self;
|
|
textArea.labelBehavior = MDCTextControlLabelBehaviorFloats;
|
|
textArea.label.text = @"This is label text";
|
|
textArea.leadingAssistiveLabel.text = @"This is assistive label text.";
|
|
if (self.shouldAddDebugBorder) {
|
|
[self addBorderToTextArea:textArea];
|
|
}
|
|
if (self.shouldAddDebugLeadingView) {
|
|
[self addLeadingViewToTextArea:textArea];
|
|
}
|
|
return textArea;
|
|
}
|
|
|
|
- (MDCOutlinedTextArea *)createMaterialOutlinedTextArea {
|
|
MDCOutlinedTextArea *textArea = [[MDCOutlinedTextArea alloc] init];
|
|
textArea.textView.delegate = self;
|
|
textArea.label.text = @"This is label text";
|
|
textArea.leadingAssistiveLabel.text = @"This is assistive label text.";
|
|
if (self.shouldAddDebugBorder) {
|
|
[self addBorderToTextArea:textArea];
|
|
}
|
|
if (self.shouldAddDebugLeadingView) {
|
|
[self addLeadingViewToTextArea:textArea];
|
|
}
|
|
[textArea applyThemeWithScheme:self.containerScheme];
|
|
return textArea;
|
|
}
|
|
|
|
- (MDCBaseTextArea *)createDefaultBaseTextArea {
|
|
MDCBaseTextArea *textArea = [[MDCBaseTextArea alloc] init];
|
|
textArea.textView.delegate = self;
|
|
textArea.label.text = @"This is label text";
|
|
textArea.leadingAssistiveLabel.text = @"This is assistive label text.";
|
|
if (self.shouldAddDebugBorder) {
|
|
[self addBorderToTextArea:textArea];
|
|
}
|
|
if (self.shouldAddDebugLeadingView) {
|
|
[self addLeadingViewToTextArea:textArea];
|
|
}
|
|
return textArea;
|
|
}
|
|
|
|
- (void)textViewDidChange:(UITextView *)textView {
|
|
[self.view setNeedsLayout];
|
|
}
|
|
|
|
- (void)addBorderToTextArea:(MDCBaseTextArea *)textArea {
|
|
textArea.layer.borderColor = UIColor.redColor.CGColor;
|
|
textArea.layer.borderWidth = 1;
|
|
}
|
|
|
|
- (void)addLeadingViewToTextArea:(MDCBaseTextArea *)textArea {
|
|
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
|
|
imageView.tintColor = self.containerScheme.colorScheme.primaryColor;
|
|
UIImage *image = [[UIImage imageNamed:@"system_icons/cake"]
|
|
imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
|
|
imageView.image = image;
|
|
textArea.leadingView = imageView;
|
|
textArea.leadingViewMode = UITextFieldViewModeAlways;
|
|
}
|
|
|
|
#pragma mark Overrides
|
|
|
|
- (void)initializeScrollViewSubviewsArray {
|
|
[super initializeScrollViewSubviewsArray];
|
|
|
|
self.shouldAddDebugBorder = NO;
|
|
self.shouldAddDebugLeadingView = NO;
|
|
|
|
MDCFilledTextArea *filledTextAreaWithoutFloatingLabel = [self createMaterialFilledTextArea];
|
|
filledTextAreaWithoutFloatingLabel.labelBehavior = MDCTextControlLabelBehaviorDisappears;
|
|
MDCOutlinedTextArea *outlinedTextAreaWithoutFloatingLabel = [self createMaterialOutlinedTextArea];
|
|
outlinedTextAreaWithoutFloatingLabel.labelBehavior = MDCTextControlLabelBehaviorDisappears;
|
|
MDCBaseTextArea *baseTextAreaWithoutFloatingLabel = [self createDefaultBaseTextArea];
|
|
baseTextAreaWithoutFloatingLabel.labelBehavior = MDCTextControlLabelBehaviorDisappears;
|
|
|
|
NSArray *textAreaRelatedScrollViewSubviews = @[
|
|
[self createLabelWithText:@"MDCFilledTextArea:"],
|
|
[self createMaterialFilledTextArea],
|
|
[self createLabelWithText:@"MDCFilledTextArea without floating label:"],
|
|
filledTextAreaWithoutFloatingLabel,
|
|
[self createLabelWithText:@"MDCOutlinedTextArea:"],
|
|
[self createMaterialOutlinedTextArea],
|
|
[self createLabelWithText:@"MDCOutlinedTextArea without floating label:"],
|
|
outlinedTextAreaWithoutFloatingLabel,
|
|
[self createLabelWithText:@"MDCBaseTextArea:"],
|
|
[self createDefaultBaseTextArea],
|
|
[self createLabelWithText:@"MDCBaseTextArea without floating label:"],
|
|
baseTextAreaWithoutFloatingLabel,
|
|
];
|
|
NSMutableArray *mutableScrollViewSubviews = [self.scrollViewSubviews mutableCopy];
|
|
self.scrollViewSubviews =
|
|
[mutableScrollViewSubviews arrayByAddingObjectsFromArray:textAreaRelatedScrollViewSubviews];
|
|
}
|
|
|
|
- (void)applyThemesToScrollViewSubviews {
|
|
[super applyThemesToScrollViewSubviews];
|
|
|
|
[self applyThemesToTextAreas];
|
|
}
|
|
|
|
- (void)resizeScrollViewSubviews {
|
|
[super resizeScrollViewSubviews];
|
|
|
|
[self resizeTextAreas];
|
|
}
|
|
|
|
- (void)enforcePreferredFonts {
|
|
[super enforcePreferredFonts];
|
|
|
|
[self.allTextAreas
|
|
enumerateObjectsUsingBlock:^(MDCBaseTextArea *textArea, NSUInteger idx, BOOL *stop) {
|
|
textArea.textView.adjustsFontForContentSizeCategory = YES;
|
|
textArea.textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody
|
|
compatibleWithTraitCollection:textArea.traitCollection];
|
|
textArea.leadingAssistiveLabel.font =
|
|
[UIFont preferredFontForTextStyle:UIFontTextStyleCaption2
|
|
compatibleWithTraitCollection:textArea.traitCollection];
|
|
textArea.trailingAssistiveLabel.font =
|
|
[UIFont preferredFontForTextStyle:UIFontTextStyleCaption2
|
|
compatibleWithTraitCollection:textArea.traitCollection];
|
|
}];
|
|
}
|
|
|
|
- (void)handleResignFirstResponderTapped {
|
|
[super handleResignFirstResponderTapped];
|
|
|
|
[self.allTextAreas
|
|
enumerateObjectsUsingBlock:^(MDCBaseTextArea *textArea, NSUInteger idx, BOOL *stop) {
|
|
[textArea.textView resignFirstResponder];
|
|
}];
|
|
}
|
|
|
|
- (void)handleDisableButtonTapped {
|
|
[super handleDisableButtonTapped];
|
|
|
|
[self.allTextAreas enumerateObjectsUsingBlock:^(MDCBaseTextArea *_Nonnull textArea,
|
|
NSUInteger idx, BOOL *_Nonnull stop) {
|
|
textArea.enabled = !self.isDisabled;
|
|
}];
|
|
}
|
|
|
|
#pragma mark Private helper methods
|
|
|
|
- (void)resizeTextAreas {
|
|
CGFloat textAreaWidth = CGRectGetWidth(self.view.frame) - (2 * self.defaultPadding);
|
|
[self.allTextAreas
|
|
enumerateObjectsUsingBlock:^(MDCBaseTextArea *textArea, NSUInteger idx, BOOL *stop) {
|
|
CGFloat textAreaMinX = CGRectGetMinX(textArea.frame);
|
|
CGFloat textAreaMinY = CGRectGetMinY(textArea.frame);
|
|
CGFloat viewHeight = CGRectGetHeight(textArea.frame);
|
|
CGRect viewFrame = CGRectMake(textAreaMinX, textAreaMinY, textAreaWidth, viewHeight);
|
|
textArea.frame = viewFrame;
|
|
[textArea sizeToFit];
|
|
}];
|
|
}
|
|
|
|
- (void)applyThemesToTextAreas {
|
|
[self.allTextAreas
|
|
enumerateObjectsUsingBlock:^(MDCBaseTextArea *textArea, NSUInteger idx, BOOL *stop) {
|
|
BOOL isEven = idx % 2 == 0;
|
|
if (self.isErrored) {
|
|
if ([textArea isKindOfClass:[MDCOutlinedTextArea class]]) {
|
|
MDCOutlinedTextArea *outlinedTextArea = (MDCOutlinedTextArea *)textArea;
|
|
[outlinedTextArea applyErrorThemeWithScheme:self.containerScheme];
|
|
}
|
|
if (isEven) {
|
|
textArea.leadingAssistiveLabel.text = @"Suspendisse quam elit, mattis sit amet justo "
|
|
@"vel, venenatis lobortis massa. Donec metus "
|
|
@"dolor.";
|
|
} else {
|
|
textArea.leadingAssistiveLabel.text = @"This is an error.";
|
|
}
|
|
} else {
|
|
if ([textArea isKindOfClass:[MDCOutlinedTextArea class]]) {
|
|
MDCOutlinedTextArea *outlinedTextArea = (MDCOutlinedTextArea *)textArea;
|
|
[outlinedTextArea applyThemeWithScheme:self.containerScheme];
|
|
}
|
|
if (isEven) {
|
|
textArea.leadingAssistiveLabel.text = @"This is helper text.";
|
|
} else {
|
|
textArea.leadingAssistiveLabel.text = nil;
|
|
}
|
|
}
|
|
}];
|
|
}
|
|
|
|
- (NSArray<MDCBaseTextArea *> *)allTextAreas {
|
|
return [self allScrollViewSubviewsOfClass:[MDCBaseTextArea class]];
|
|
}
|
|
|
|
@end
|