// 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 () @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 *)allTextAreas { return [self allScrollViewSubviewsOfClass:[MDCBaseTextArea class]]; } @end