123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- //
- // FLEXArgumentInputTextView.m
- // FLEXInjected
- //
- // Created by Ryan Olson on 6/15/14.
- //
- //
- #import "FLEXColor.h"
- #import "FLEXArgumentInputTextView.h"
- #import "FLEXUtility.h"
- @interface FLEXArgumentInputTextView ()
- #if TARGET_OS_TV
- @property (nonatomic) KBSelectableTextView *inputTextView;
- #else
- @property (nonatomic) UITextView *inputTextView;
- #endif
- @property (nonatomic) UILabel *placeholderLabel;
- @property (nonatomic, readonly) NSUInteger numberOfInputLines;
- @end
- @implementation FLEXArgumentInputTextView
- - (instancetype)initWithArgumentTypeEncoding:(const char *)typeEncoding {
- self = [super initWithArgumentTypeEncoding:typeEncoding];
- if (self) {
- #if TARGET_OS_TV
- self.inputTextView = [[KBSelectableTextView alloc] initWithFrame:CGRectZero];
- #else
- self.inputTextView = [UITextView new];
- self.inputTextView.inputAccessoryView = [self createToolBar];
- #endif
- self.inputTextView.font = [[self class] inputFont];
- self.inputTextView.backgroundColor = FLEXColor.secondaryGroupedBackgroundColor;
- self.inputTextView.layer.cornerRadius = 10.f;
- self.inputTextView.contentInset = UIEdgeInsetsMake(0, 5, 0, 0);
- self.inputTextView.autocapitalizationType = UITextAutocapitalizationTypeNone;
- self.inputTextView.autocorrectionType = UITextAutocorrectionTypeNo;
- self.inputTextView.delegate = self;
- if (@available(iOS 11, *)) {
- [self.inputTextView.layer setValue:@YES forKey:@"continuousCorners"];
- } else {
- self.inputTextView.layer.borderWidth = 1.f;
- self.inputTextView.layer.borderColor = FLEXColor.borderColor.CGColor;
- }
- self.placeholderLabel = [UILabel new];
- self.placeholderLabel.font = self.inputTextView.font;
- self.placeholderLabel.textColor = FLEXColor.deemphasizedTextColor;
- self.placeholderLabel.numberOfLines = 0;
- [self addSubview:self.inputTextView];
- [self.inputTextView addSubview:self.placeholderLabel];
- }
- return self;
- }
- #pragma mark - Private
- #if !TARGET_OS_TV
- - (UIToolbar *)createToolBar {
- UIToolbar *toolBar = [UIToolbar new];
- [toolBar sizeToFit];
- UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc]
- initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
- target:nil action:nil
- ];
- UIBarButtonItem *pasteItem = [[UIBarButtonItem alloc]
- initWithTitle:@"Paste" style:UIBarButtonItemStyleDone
- target:self.inputTextView action:@selector(paste:)
- ];
- UIBarButtonItem *doneItem = [[UIBarButtonItem alloc]
- initWithBarButtonSystemItem:UIBarButtonSystemItemDone
- target:self.inputTextView action:@selector(resignFirstResponder)
- ];
- toolBar.items = @[spaceItem, pasteItem, doneItem];
- return toolBar;
- }
- #endif
- - (void)setInputPlaceholderText:(NSString *)placeholder {
- self.placeholderLabel.text = placeholder;
- if (placeholder.length) {
- if (!self.inputTextView.text.length) {
- self.placeholderLabel.hidden = NO;
- } else {
- self.placeholderLabel.hidden = YES;
- }
- } else {
- self.placeholderLabel.hidden = YES;
- }
- [self setNeedsLayout];
- }
- - (NSString *)inputPlaceholderText {
- return self.placeholderLabel.text;
- }
- #pragma mark - Superclass Overrides
- - (BOOL)inputViewIsFirstResponder {
- return self.inputTextView.isFirstResponder;
- }
- #pragma mark - Layout and Sizing
- - (void)layoutSubviews {
- [super layoutSubviews];
-
- self.inputTextView.frame = CGRectMake(0, self.topInputFieldVerticalLayoutGuide, self.bounds.size.width, [self inputTextViewHeight]);
- // Placeholder label is positioned by insetting then origin
- // by the content inset then the text container inset
- CGSize s = self.inputTextView.frame.size;
- self.placeholderLabel.frame = CGRectMake(0, 0, s.width, s.height);
- self.placeholderLabel.frame = UIEdgeInsetsInsetRect(
- UIEdgeInsetsInsetRect(self.placeholderLabel.frame, self.inputTextView.contentInset),
- self.inputTextView.textContainerInset
- );
- }
- - (NSUInteger)numberOfInputLines {
- switch (self.targetSize) {
- case FLEXArgumentInputViewSizeDefault:
- return 2;
- case FLEXArgumentInputViewSizeSmall:
- return 1;
- case FLEXArgumentInputViewSizeLarge:
- return 8;
- }
- }
- - (CGFloat)inputTextViewHeight {
- CGFloat padding = 16.0;
- #if TARGET_OS_TV
- padding = 40.0;
- #endif
- return ceil([[self class] inputFont].lineHeight * self.numberOfInputLines) + padding;
- }
- - (CGSize)sizeThatFits:(CGSize)size {
- CGSize fitSize = [super sizeThatFits:size];
- fitSize.height += [self inputTextViewHeight];
- return fitSize;
- }
- #pragma mark - Class Helpers
- + (UIFont *)inputFont {
- return [UIFont systemFontOfSize:14.0];
- }
- #pragma mark - UITextViewDelegate
- - (void)textViewDidChange:(UITextView *)textView {
- [self.delegate argumentInputViewValueDidChange:self];
- self.placeholderLabel.hidden = !(self.inputPlaceholderText.length && !textView.text.length);
- }
- @end
|