CustomTextView.m 10 KB

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