CustomTextView.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. //
  2. // CustomTextView.m
  3. // JasonDevelop
  4. //
  5. // Created by Jason Lee on 10/26/14.
  6. // Copyright (c) jasondevelop. All rights reserved.
  7. //
  8. #import "NSString-Addtions.h"
  9. #import "CommonUtil.h"
  10. #import "CustomTextView.h"
  11. #define kUIBtnTintColor [UIColor whiteColor]
  12. #define kfBoxCap 4.0f
  13. #define kUIPlaceHolderColor RGBCOLOR(204.0f, 204.0f, 204.0f)
  14. @interface CustomTextView () {
  15. @protected
  16. UIView *_targetSuperView;
  17. CGRect _cRect;
  18. CGRect _superRect;
  19. CGPoint _contentOffset;
  20. CGFloat _marginTop, _naviMargin, _adjustY;
  21. UIBarButtonItem *_btnPrev, *_btnNext, *_btnClose;
  22. UIToolbar *_toolBar;
  23. NSMutableArray *_barItems;
  24. UIBarButtonItem *_btnFlexibleSpace;
  25. UIEdgeInsets _bgInsets;
  26. BOOL _isSecureEntry;
  27. UIImage *_bgImage;
  28. }
  29. @end
  30. @implementation CustomTextView
  31. @dynamic delegate;
  32. - (id)initWithFrame:(CGRect)frame {
  33. if (self = [super initWithFrame:frame]) {
  34. _customTextViewSuperview = CustomTextViewSuperviewIsViewController;
  35. self.inputAccessoryView = [self generateAccessoryView];
  36. _bgImageName = @"tp_01_img_input_bg_01";
  37. UIImage *bgImage = [UIImage imageNamed:_bgImageName];
  38. if (bgImage) {
  39. _bgInsets = UIEdgeInsetsMake(kfBoxCap, kfBoxCap, kfBoxCap, kfBoxCap);
  40. bgImage = [CommonUtil resizableImageWithCapInsets:_bgInsets resizingMode:UIImageResizingModeStretch img:bgImage];
  41. // [self setBackground:bgImage];
  42. }
  43. _cRect = self.frame;
  44. }
  45. return self;
  46. }
  47. - (void)awakeFromNib {
  48. _customTextViewSuperview = CustomTextViewSuperviewIsViewController;
  49. self.inputAccessoryView = [self generateAccessoryView];
  50. _bgImageName = _bgImageName && ![_bgImageName isEmptyString] ? _bgImageName : @"tp_01_img_input_bg_01";
  51. _bgImage = [UIImage imageNamed:_bgImageName];
  52. if (_bgImage) {
  53. if (!CGRectEqualToRect(_rectForCapBackground, CGRectZero)) {//rectForCap이 설정된 경우, 이미지를 리사이즈함.
  54. CGFloat top, left, bottom, right;
  55. top = CGRectGetMinY(_rectForCapBackground);
  56. left = CGRectGetMinX(_rectForCapBackground);
  57. bottom = CGRectGetHeight(_rectForCapBackground);
  58. right = CGRectGetWidth(_rectForCapBackground);
  59. _bgInsets = UIEdgeInsetsMake(top, left, bottom, right);
  60. } else {
  61. _bgInsets = UIEdgeInsetsMake(kfBoxCap, kfBoxCap, kfBoxCap, kfBoxCap);
  62. }
  63. _bgImage = [CommonUtil resizableImageWithCapInsets:_bgInsets resizingMode:UIImageResizingModeStretch img:_bgImage];
  64. }
  65. _cRect = self.frame;
  66. if (_placeHolder) {
  67. self.text = _placeHolder;
  68. }
  69. #ifdef DEBUG
  70. NSString *identifier = [NSString stringWithFormat:@"%@", self.placeHolder];
  71. [self setValue:identifier forKey:@"layoutDebuggingIdentifier"];
  72. #endif
  73. self.textContainerInset = UIEdgeInsetsMake(25.0f, 20.0f, 25.0f, 20.0f);
  74. }
  75. - (void)drawRect:(CGRect)rect {
  76. _bgImage = [CommonUtil resizableImageWithCapInsets:_bgInsets resizingMode:UIImageResizingModeStretch img:_bgImage];
  77. [_bgImage drawInRect:rect];
  78. self.textColor = [self.text isEqualToString:_placeHolder] ? self.placeHolderColor : self.textColor;
  79. }
  80. - (UIView *)generateAccessoryView {
  81. CGFloat width = [UIScreen mainScreen].bounds.size.width;
  82. _toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0, 0.0, width, 44.0)];
  83. _toolBar.barStyle = UIBarStyleBlack;
  84. _toolBar.translucent = YES;
  85. _barItems = [NSMutableArray new];
  86. _btnFlexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
  87. _btnPrev = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"이전", @"이전")
  88. style:UIBarButtonItemStylePlain
  89. target:self
  90. action:@selector(goPrevField:)];
  91. _btnNext = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"다음", @"다음")
  92. style:UIBarButtonItemStylePlain
  93. target:self
  94. action:@selector(goNextField:)];
  95. _btnClose = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"닫기", @"닫기")
  96. style:UIBarButtonItemStylePlain
  97. target:self
  98. action:@selector(hideKeyboard:)];
  99. if (IOS_VERSION >= 7.0f) {
  100. _btnClose.tintColor = kUIBtnTintColor;
  101. _btnPrev.tintColor = kUIBtnTintColor;
  102. _btnNext.tintColor = kUIBtnTintColor;
  103. }
  104. [_barItems addObject:_btnFlexibleSpace];
  105. [_barItems addObject:_btnClose];
  106. [_toolBar setItems:_barItems animated:YES];
  107. return _toolBar;
  108. }
  109. - (void)setCustomTextViewMove:(CustomTextViewMove)customTextViewMove {
  110. [_barItems removeAllObjects];
  111. switch (customTextViewMove) {
  112. case CustomTextViewMovePrev:
  113. _btnNext.enabled = NO;
  114. [_barItems addObject:_btnPrev];
  115. [_barItems addObject:_btnNext];
  116. [_barItems addObject:_btnFlexibleSpace];
  117. [_barItems addObject:_btnClose];
  118. break;
  119. case CustomTextViewMoveNext:
  120. _btnPrev.enabled = NO;
  121. [_barItems addObject:_btnPrev];
  122. [_barItems addObject:_btnNext];
  123. [_barItems addObject:_btnFlexibleSpace];
  124. [_barItems addObject:_btnClose];
  125. break;
  126. case CustomTextVoewMoveBoth:
  127. [_barItems addObject:_btnPrev];
  128. [_barItems addObject:_btnNext];
  129. [_barItems addObject:_btnFlexibleSpace];
  130. [_barItems addObject:_btnClose];
  131. break;
  132. default:
  133. break;
  134. }
  135. [_toolBar setItems:_barItems animated:YES];
  136. }
  137. - (BOOL)becomeFirstResponder {
  138. if ([_placeHolder isEqualToString:self.text]) {
  139. self.text = ksEmptyString;
  140. }
  141. _bgImage = _bgPressImageName && ![_bgPressImageName isEmptyString] ? [UIImage imageNamed:_bgPressImageName] : _bgImage;
  142. [self setNeedsDisplay];
  143. if (_autoScrollUp) {
  144. // if (_customTextViewSuperview == CustomTextViewSuperviewIsView) {
  145. // _targetSuperView = self.superview;
  146. // } else if (_customTextViewSuperview == CustomTextViewSuperviewIsViewController) {
  147. // UIViewController *vc = [AOTFacade facade].currentViewController;
  148. // _targetSuperView = vc.view;
  149. // } else if (_customTextViewSuperview == CustomTextViewSuperviewIsPopup) {
  150. // _targetSuperView = self.superview.superview;
  151. // }
  152. CGFloat naviMargin = 20.0f;
  153. if (_customTextViewSuperview == CustomTextViewSuperviewIsViewController) {
  154. UIViewController *vc = [CommonUtil currentViewController];
  155. _targetSuperView = vc.view;
  156. } else if (_customTextViewSuperview == CustomTextViewSuperviewIsPopup) {
  157. _targetSuperView = self.superview.superview;
  158. } else if (_customTextViewSuperview == CustomTextViewSuperviewIsPopupContentView) {
  159. _targetSuperView = self.superview.superview.superview;
  160. } else if (_customTextViewSuperview == CustomTextViewSuperviewIsContentView) {
  161. _targetSuperView = self.superview.superview.superview;
  162. naviMargin = 85.0f;
  163. }
  164. CGRect selfRect = self.frame;
  165. if (CGRectEqualToRect(_superRect, CGRectZero)) {
  166. _superRect = _targetSuperView.frame;
  167. }
  168. CGRect cr = [self.superview convertRect:selfRect toView:_targetSuperView];
  169. CGFloat cy = (cr.origin.y + cr.size.height);
  170. CGFloat ky = ([UIScreen mainScreen].bounds.size.height - naviMargin) - (PORTRAIT_KEYBOARD_HEIGHT + KEYBOARD_ACCESSORY_HEIGHT); // 260
  171. if (cy >= ky) {
  172. CGRect scrollRect = _targetSuperView.frame;
  173. scrollRect.origin.y = ky - cy;
  174. [UIView animateWithDuration:ANIMATION_DUR animations:^{
  175. if ([_targetSuperView isKindOfClass:[UIScrollView class]]) {
  176. [(UIScrollView *)_targetSuperView setContentOffset:CGPointMake(0, cy - ky) animated:NO];
  177. } else {
  178. _targetSuperView.frame = scrollRect;
  179. }
  180. }];
  181. } else {
  182. if (!CGRectEqualToRect(_superRect, CGRectZero)) {
  183. [UIView animateWithDuration:ANIMATION_DUR animations:^{
  184. _targetSuperView.frame = _superRect;
  185. }];
  186. }
  187. }
  188. }
  189. return [super becomeFirstResponder];
  190. }
  191. - (BOOL)resignFirstResponder {
  192. // NSLog(@"%@, resignFirstResponder", self);
  193. if ([self.text isEqualToString:ksEmptyString]) {
  194. self.text = _placeHolder;
  195. }
  196. _bgImage = _bgImageName && ![_bgImageName isEmptyString] ? [UIImage imageNamed:_bgImageName] : [UIImage imageNamed:@"input_wh"];
  197. [self setNeedsDisplay];
  198. if (_autoScrollUp) {
  199. if (_customTextViewSuperview == CustomTextViewSuperviewIsViewController) {
  200. UIViewController *vc = [CommonUtil currentViewController];
  201. _targetSuperView = vc.view;
  202. } else if (_customTextViewSuperview == CustomTextViewSuperviewIsPopup) {
  203. _targetSuperView = self.superview.superview;
  204. }
  205. [UIView animateWithDuration:ANIMATION_DUR animations:^{
  206. if (!CGRectIsEmpty(_superRect)) {
  207. _targetSuperView.frame = _superRect;
  208. }
  209. }];
  210. }
  211. return [super resignFirstResponder];
  212. }
  213. - (void)goPrevField:(id)sender {
  214. [self resignFirstResponder];
  215. if ([self.delegate respondsToSelector:@selector(moveToPrevField:)]) {
  216. [self.delegate moveToPrevField:self];
  217. }
  218. }
  219. - (void)goNextField:(id)sender {
  220. [self resignFirstResponder];
  221. if ([self.delegate respondsToSelector:@selector(moveToNextField:)]) {
  222. [self.delegate moveToNextField:self];
  223. }
  224. }
  225. - (void)hideKeyboard:(id)sender {
  226. [self resignFirstResponder];
  227. if ([self.delegate respondsToSelector:@selector(willHideKeyboard:)]) {
  228. [self.delegate willHideKeyboard:self];
  229. }
  230. }
  231. //-(void)textViewDidChange:(UITextView *)textView {
  232. // // Enable and disable lblPlaceHolderText
  233. // if ([textView.text length] > 0) {
  234. // [textView setBackgroundColor:[UIColor whiteColor]];
  235. //// [lblPlaceHolderText setHidden:YES];
  236. // } else {
  237. // [textView setBackgroundColor:[UIColor clearColor]];
  238. //// [lblPlaceHolderText setHidden:NO];
  239. // }
  240. //}
  241. @end