FLEXArgumentInputTextView.m 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. //
  2. // FLEXArgumentInputTextView.m
  3. // FLEXInjected
  4. //
  5. // Created by Ryan Olson on 6/15/14.
  6. //
  7. //
  8. #import "FLEXColor.h"
  9. #import "FLEXArgumentInputTextView.h"
  10. #import "FLEXUtility.h"
  11. @interface FLEXArgumentInputTextView () <UITextViewDelegate>
  12. @property (nonatomic, strong) UITextView *inputTextView;
  13. @property (nonatomic, readonly) NSUInteger numberOfInputLines;
  14. @end
  15. @implementation FLEXArgumentInputTextView
  16. - (instancetype)initWithArgumentTypeEncoding:(const char *)typeEncoding
  17. {
  18. self = [super initWithArgumentTypeEncoding:typeEncoding];
  19. if (self) {
  20. self.inputTextView = [[UITextView alloc] init];
  21. self.inputTextView.font = [[self class] inputFont];
  22. self.inputTextView.backgroundColor = [FLEXColor systemBackgroundColor];
  23. self.inputTextView.layer.borderColor = [[FLEXColor borderColor] CGColor];
  24. self.inputTextView.layer.borderWidth = 1.0;
  25. self.inputTextView.autocapitalizationType = UITextAutocapitalizationTypeNone;
  26. self.inputTextView.autocorrectionType = UITextAutocorrectionTypeNo;
  27. self.inputTextView.delegate = self;
  28. self.inputTextView.inputAccessoryView = [self createToolBar];
  29. [self addSubview:self.inputTextView];
  30. }
  31. return self;
  32. }
  33. #pragma mark - private
  34. - (UIToolbar*)createToolBar
  35. {
  36. UIToolbar *toolBar = [UIToolbar new];
  37. [toolBar sizeToFit];
  38. UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
  39. UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(textViewDone)];
  40. toolBar.items = @[spaceItem, doneItem];
  41. return toolBar;
  42. }
  43. - (void)textViewDone
  44. {
  45. [self.inputTextView resignFirstResponder];
  46. }
  47. #pragma mark - Text View Changes
  48. - (void)textViewDidChange:(UITextView *)textView
  49. {
  50. [self.delegate argumentInputViewValueDidChange:self];
  51. }
  52. #pragma mark - Superclass Overrides
  53. - (BOOL)inputViewIsFirstResponder
  54. {
  55. return self.inputTextView.isFirstResponder;
  56. }
  57. #pragma mark - Layout and Sizing
  58. - (void)layoutSubviews
  59. {
  60. [super layoutSubviews];
  61. self.inputTextView.frame = CGRectMake(0, self.topInputFieldVerticalLayoutGuide, self.bounds.size.width, [self inputTextViewHeight]);
  62. }
  63. - (NSUInteger)numberOfInputLines
  64. {
  65. NSUInteger numberOfInputLines = 0;
  66. switch (self.targetSize) {
  67. case FLEXArgumentInputViewSizeDefault:
  68. numberOfInputLines = 2;
  69. break;
  70. case FLEXArgumentInputViewSizeSmall:
  71. numberOfInputLines = 1;
  72. break;
  73. case FLEXArgumentInputViewSizeLarge:
  74. numberOfInputLines = 8;
  75. break;
  76. }
  77. return numberOfInputLines;
  78. }
  79. - (CGFloat)inputTextViewHeight
  80. {
  81. return ceil([[self class] inputFont].lineHeight * self.numberOfInputLines) + 16.0;
  82. }
  83. - (CGSize)sizeThatFits:(CGSize)size
  84. {
  85. CGSize fitSize = [super sizeThatFits:size];
  86. fitSize.height += [self inputTextViewHeight];
  87. return fitSize;
  88. }
  89. #pragma mark - Trait collection changes
  90. - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
  91. #if FLEX_AT_LEAST_IOS13_SDK
  92. if (@available(iOS 13.0, *)) {
  93. if (previousTraitCollection.userInterfaceStyle != self.traitCollection.userInterfaceStyle) {
  94. self.inputTextView.layer.borderColor = [[FLEXColor borderColor] CGColor];
  95. }
  96. }
  97. #endif
  98. }
  99. #pragma mark - Class Helpers
  100. + (UIFont *)inputFont
  101. {
  102. return [FLEXUtility defaultFontOfSize:14.0];
  103. }
  104. @end