JXRedInputView.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. //
  2. // JXRedInputView.m
  3. // shiku_im
  4. //
  5. // Created by 1 on 17/8/15.
  6. // Copyright © 2017年 Reese. All rights reserved.
  7. //
  8. #import "JXRedInputView.h"
  9. #define RowHeight 48
  10. #define RowMaxHeight 60
  11. #define RowMargin 10
  12. #define RowMaxMargin 15
  13. @interface JXRedInputView () <UITextFieldDelegate> {
  14. CGFloat _greetY;
  15. CGFloat _countY;
  16. CGFloat _moneyY;
  17. CGFloat _sendY;
  18. }
  19. @end
  20. @implementation JXRedInputView
  21. -(instancetype)initWithFrame:(CGRect)frame type:(NSUInteger)type isRoom:(BOOL)isRoom delegate:(id)delegate{
  22. if (self = [super initWithFrame:frame]) {
  23. self.frame = frame;
  24. self.type = type;
  25. self.delegate = delegate;
  26. self.isRoom = isRoom;
  27. [self customSubViews];
  28. }
  29. return self;
  30. }
  31. -(instancetype)init{
  32. if (self = [super init]) {
  33. [self customSubViews];
  34. }
  35. return self;
  36. }
  37. -(instancetype)initWithFrame:(CGRect)frame{
  38. if (self = [super initWithFrame:frame]) {
  39. [self customSubViews];
  40. }
  41. return self;
  42. }
  43. -(void)layoutSubviews{
  44. if (_type == 3) {
  45. _greetY = RowMargin;
  46. if(_isRoom){
  47. _countY = RowMargin + RowHeight+ 43;
  48. _moneyY = _countY + RowHeight;
  49. _sendY = RowHeight*3+RowMaxHeight+RowMargin+90;
  50. }else{
  51. _moneyY = RowMargin + RowHeight+43;
  52. _sendY = RowHeight+RowMaxHeight+RowMargin+RowMaxHeight+60;
  53. }
  54. }else{
  55. if(_isRoom){
  56. _countY = RowMargin;
  57. _moneyY = _countY + RowHeight;
  58. _greetY = _moneyY + RowHeight + 43;
  59. _sendY = RowHeight*2+RowMaxHeight+RowMargin+RowMaxHeight+90;
  60. }else{
  61. _moneyY = RowMargin;
  62. _greetY = _moneyY +RowMargin*2 + RowHeight;
  63. _sendY = RowHeight+RowMaxHeight+RowMargin+RowMaxHeight+60;
  64. if (_type == 1) {
  65. _greetY = _moneyY + RowHeight + RowMaxMargin;
  66. _sendY = RowHeight+RowMaxHeight+RowMargin+RowMaxHeight+50;
  67. }
  68. }
  69. }
  70. if(_isRoom){
  71. _countView.frame = CGRectMake(0, _countY, self.frame.size.width, RowHeight);
  72. _countUnit.frame = CGRectMake(CGRectGetWidth(_countView.frame)-40, 0, 40, RowHeight);
  73. _countTextField.frame = CGRectMake(CGRectGetMaxX(_countTitle.frame), 0, CGRectGetMinX(_countUnit.frame)-CGRectGetMaxX(_countTitle.frame), RowHeight);
  74. _line.frame = CGRectMake(15, RowHeight-LINE_WH, JX_SCREEN_WIDTH-15, LINE_WH);
  75. }
  76. _moneyView.frame = CGRectMake(0, _moneyY, self.frame.size.width, RowHeight);
  77. _moneyUnit.frame = CGRectMake(CGRectGetWidth(_moneyView.frame)-40, 0, 40, RowHeight);
  78. _moneyTextField.frame = CGRectMake(CGRectGetMaxX(_moneyTitle.frame), 0, CGRectGetMinX(_moneyUnit.frame)-CGRectGetMaxX(_moneyTitle.frame), RowHeight);
  79. _greetView.frame = CGRectMake(0, _greetY, self.frame.size.width, _type == 1 || (_type == 2 && _isRoom) ? RowMaxHeight : RowHeight);
  80. _sendButton.frame = CGRectMake(15, _sendY, self.frame.size.width-15*2, 43);
  81. _sendButton.tag = _type;
  82. _allMoneyLab.frame = CGRectMake(0, CGRectGetMinY(_sendButton.frame)-22 - 26, JX_SCREEN_WIDTH, 22);
  83. if (_type == 3) {
  84. _greetTitle.hidden = NO;
  85. _greetTextField.frame = CGRectMake(CGRectGetMaxX(_greetTitle.frame), 0, CGRectGetWidth(_greetView.frame)-CGRectGetWidth(_greetTitle.frame)-15, RowHeight);
  86. _noticeTitle.frame = CGRectMake(15, CGRectGetMaxY(_greetView.frame)+12, JX_SCREEN_WIDTH-15, 13);
  87. }else{
  88. _greetTitle.hidden = YES;
  89. _noticeTitle.frame = CGRectMake(15, CGRectGetMaxY(_moneyView.frame)+12, JX_SCREEN_WIDTH-15, 13);
  90. _greetTextField.frame = CGRectMake(0, 0, CGRectGetWidth(_greetView.frame), _type == 1 || (_type == 2 && _isRoom) ? RowMaxHeight : RowHeight);
  91. }
  92. [self viewLocalized];
  93. }
  94. -(void)viewLocalized{
  95. _countTitle.text = Localized(@"JXRed_numberPackets");// @"红包个数";//
  96. _moneyTitle.text = Localized(@"JXRed_totalAmount");//@"总金额";//
  97. _countUnit.text = Localized(@"JXRed_A");//@"个";//
  98. _moneyUnit.text = Localized(@"JX_ChinaMoney");//@"元";//
  99. [_sendButton setTitle:Localized(@"JXRed_send") forState:UIControlStateNormal];//@"塞钱进红包"
  100. [_sendButton setTitle:Localized(@"JXRed_send") forState:UIControlStateHighlighted];
  101. _moneyTextField.placeholder = Localized(@"JXRed_inputAmount");//@"输入金额";//
  102. _countTextField.placeholder = Localized(@"JXRed_inputNumPackets");//@"请输入红包个数";//
  103. switch (_type) {
  104. case 1:{
  105. if (_isRoom) {
  106. _noticeTitle.text = Localized(@"JXRed_sameAmount");//@"小伙伴领取的金额相同";//
  107. }
  108. _greetTextField.placeholder = Localized(@"JXRed_greetOlace");//@"恭喜发财,万事如意";// Congratulation, everything goes well
  109. break;
  110. }
  111. case 2:{
  112. _noticeTitle.text = Localized(@"JXRed_ARandomAmount");//@"小伙伴领取的金额随机";//
  113. _greetTextField.placeholder = Localized(@"JXRed_greetOlace");//@"恭喜发财,万事如意";
  114. break;
  115. }
  116. case 3:{
  117. _noticeTitle.text = Localized(@"JXRed_NoticeOrder");//@"小伙伴需回复口令抢红包";//
  118. _greetTextField.placeholder = Localized(@"JXRed_orderPlace");//@"如“我真帅”";// eg."I'm so handsome";
  119. _greetTitle.text = Localized(@"JXRed_setOrder");//@"设置口令";//
  120. break;
  121. }
  122. default:
  123. break;
  124. }
  125. }
  126. -(void)customSubViews{
  127. if(_isRoom)
  128. [self addSubview:self.countView];
  129. [self addSubview:self.moneyView];
  130. [self addSubview:self.greetView];
  131. [self addSubview:self.sendButton];
  132. [self addSubview:self.noticeTitle];
  133. [self addSubview:self.allMoneyLab];
  134. }
  135. - (void)textFieldDidChange:(UITextField *)textField {
  136. _allMoneyLab.text = [NSString stringWithFormat:@"¥%.2f",[textField.text doubleValue]];
  137. _sendButton.enabled = [_moneyTextField.text doubleValue] > 0;
  138. }
  139. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
  140. NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];
  141. if (textField == _countTextField) {
  142. if ([textField.text rangeOfString:@"."].location != NSNotFound) {
  143. return NO;
  144. }
  145. }
  146. if (textField == _moneyTextField) {
  147. if ([toBeString doubleValue] > 500) {
  148. return NO;
  149. }
  150. // 首位不能输入 .
  151. if (IsStringNull(textField.text) && [string isEqualToString:@"."]) {
  152. return NO;
  153. }
  154. //限制.后面最多有两位,且不能再输入.
  155. if ([textField.text rangeOfString:@"."].location != NSNotFound) {
  156. //有.了 且.后面输入了两位 停止输入
  157. if (toBeString.length > [toBeString rangeOfString:@"."].location+3) {
  158. return NO;
  159. }
  160. //有.了,不允许再输入.
  161. if ([string isEqualToString:@"."]) {
  162. return NO;
  163. }
  164. }
  165. //限制首位0,后面只能输入. 和 删除
  166. if ([textField.text isEqualToString:@"0"]) {
  167. if (![string isEqualToString:@"."] && ![string isEqualToString:@""]) {
  168. return NO;
  169. }
  170. }
  171. //限制只能输入:1234567890.
  172. NSCharacterSet * characterSet = [[NSCharacterSet characterSetWithCharactersInString:@"1234567890."] invertedSet];
  173. NSString * filtered = [[string componentsSeparatedByCharactersInSet:characterSet] componentsJoinedByString:@""];
  174. return [string isEqualToString:filtered];
  175. }
  176. return YES;
  177. }
  178. - (UILabel *)allMoneyLab {
  179. if (!_allMoneyLab) {
  180. _allMoneyLab = [[UILabel alloc] init];
  181. _allMoneyLab.font = SYSFONT(22);
  182. _allMoneyLab.text = @"¥0.00";
  183. _allMoneyLab.textAlignment = NSTextAlignmentCenter;
  184. }
  185. return _allMoneyLab;
  186. }
  187. -(UIView *)countView{
  188. if (!_countView) {
  189. _countView = [[UIView alloc] init];
  190. _countView.backgroundColor = [UIColor whiteColor];
  191. [_countView addSubview:self.countTitle];
  192. [_countView addSubview:self.countTextField];
  193. [_countView addSubview:self.countUnit];
  194. [_countView addSubview:self.line];
  195. }
  196. return _countView;
  197. }
  198. -(UIView *)moneyView{
  199. if (!_moneyView) {
  200. _moneyView = [[UIView alloc] init];
  201. _moneyView.backgroundColor = [UIColor whiteColor];
  202. [_moneyView addSubview:self.moneyTitle];
  203. [_moneyView addSubview:self.moneyTextField];
  204. [_moneyView addSubview:self.moneyUnit];
  205. }
  206. return _moneyView;
  207. }
  208. -(UIView *)greetView{
  209. if (!_greetView) {
  210. _greetView = [[UIView alloc] init];
  211. _greetView.backgroundColor = [UIColor whiteColor];
  212. [_greetView addSubview:self.greetTitle];
  213. [_greetView addSubview:self.greetTextField];
  214. }
  215. return _greetView;
  216. }
  217. -(UIButton *)sendButton{
  218. if (!_sendButton) {
  219. _sendButton = [UIButton buttonWithType:UIButtonTypeCustom];
  220. [_sendButton setBackgroundImage:[UIImage createImageWithColor:HEXCOLOR(0xFA585E)] forState:UIControlStateNormal];
  221. [_sendButton setBackgroundImage:[UIImage createImageWithColor:[HEXCOLOR(0xFA585E) colorWithAlphaComponent:0.5]] forState:UIControlStateDisabled];
  222. [_sendButton.titleLabel setFont:g_factory.font16];
  223. _sendButton.enabled = NO;
  224. _sendButton.layer.masksToBounds = YES;
  225. _sendButton.layer.cornerRadius = 7.f;
  226. }
  227. return _sendButton;
  228. }
  229. -(UILabel *)noticeTitle{
  230. if (!_noticeTitle) {
  231. _noticeTitle = [[UILabel alloc] initWithFrame:CGRectMake(0, -20, 200, 20)];
  232. _noticeTitle.font = g_factory.font13;
  233. _noticeTitle.textColor = [UIColor lightGrayColor];
  234. }
  235. return _noticeTitle;
  236. }
  237. -(UILabel *)countTitle{
  238. if (!_countTitle) {
  239. _countTitle = [[UILabel alloc] initWithFrame:CGRectMake(15, 0, 80, RowHeight)];
  240. _countTitle.font = g_factory.font15;
  241. _countTitle.textColor = [UIColor blackColor];
  242. // _countTitle.text = @"红包个数";
  243. }
  244. return _countTitle;
  245. }
  246. -(UILabel *)moneyTitle{
  247. if (!_moneyTitle) {
  248. _moneyTitle = [[UILabel alloc] initWithFrame:CGRectMake(15, 0, 80, RowHeight)];
  249. _moneyTitle.font = g_factory.font15;
  250. _moneyTitle.textColor = [UIColor blackColor];
  251. // _moneyTitle.text = @"总金额";
  252. }
  253. return _moneyTitle;
  254. }
  255. -(UILabel *)greetTitle{
  256. if (!_greetTitle) {
  257. _greetTitle = [[UILabel alloc] initWithFrame:CGRectMake(15, 0, 80, RowHeight)];
  258. _greetTitle.font = g_factory.font15;
  259. _greetTitle.textColor = [UIColor blackColor];
  260. }
  261. return _greetTitle;
  262. }
  263. -(UITextField *)countTextField{
  264. if (!_countTextField) {
  265. _countTextField = [UIFactory createTextFieldWith:CGRectZero delegate:_delegate returnKeyType:UIReturnKeyNext secureTextEntry:NO placeholder:nil font:g_factory.font15];
  266. _countTextField.text = @""; // 红包默认最少为1个
  267. _countTextField.clearButtonMode = UITextFieldViewModeNever;
  268. _countTextField.textAlignment = NSTextAlignmentRight;
  269. _countTextField.borderStyle = UITextBorderStyleNone;
  270. _countTextField.keyboardType = UIKeyboardTypeNumberPad;
  271. }
  272. return _countTextField;
  273. }
  274. -(UITextField *)moneyTextField{
  275. if (!_moneyTextField) {
  276. _moneyTextField = [UIFactory createTextFieldWith:CGRectZero delegate:self returnKeyType:UIReturnKeyNext secureTextEntry:NO placeholder:nil font:g_factory.font15];
  277. _moneyTextField.clearButtonMode = UITextFieldViewModeNever;
  278. _moneyTextField.textAlignment = NSTextAlignmentRight;
  279. _moneyTextField.borderStyle = UITextBorderStyleNone;
  280. _moneyTextField.keyboardType = UIKeyboardTypeDecimalPad;
  281. [_moneyTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
  282. }
  283. return _moneyTextField;
  284. }
  285. -(UITextField *)greetTextField{
  286. if (!_greetTextField) {
  287. _greetTextField = [UIFactory createTextFieldWith:CGRectZero delegate:_delegate returnKeyType:UIReturnKeyNext secureTextEntry:NO placeholder:nil font:g_factory.font15];
  288. _greetTextField.textAlignment = NSTextAlignmentLeft;
  289. _greetTextField.borderStyle = UITextBorderStyleNone;
  290. _greetTextField.keyboardType = UIKeyboardTypeDefault;
  291. UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 15, 15)];
  292. _greetTextField.leftView = view;
  293. _greetTextField.leftViewMode = UITextFieldViewModeAlways;
  294. }
  295. return _greetTextField;
  296. }
  297. -(UILabel *)countUnit{
  298. if (!_countUnit) {
  299. _countUnit = [[UILabel alloc] initWithFrame:CGRectZero];
  300. _countUnit.font = g_factory.font15;
  301. _countUnit.textColor = [UIColor blackColor];
  302. _countUnit.textAlignment = NSTextAlignmentCenter;
  303. // _countUnit.text = @"个";
  304. }
  305. return _countUnit;
  306. }
  307. -(UILabel *)moneyUnit{
  308. if (!_moneyUnit) {
  309. _moneyUnit = [[UILabel alloc] initWithFrame:CGRectZero];
  310. _moneyUnit.font = g_factory.font15;
  311. _moneyUnit.textColor = [UIColor blackColor];
  312. _moneyUnit.textAlignment = NSTextAlignmentCenter;
  313. // _moneyUnit.text = @"元";
  314. }
  315. return _moneyUnit;
  316. }
  317. - (UIView *)line {
  318. if (!_line) {
  319. _line = [[UIView alloc] init];
  320. _line.backgroundColor = THE_LINE_COLOR;
  321. }
  322. return _line;
  323. }
  324. -(void)stopEdit{
  325. [_countTextField resignFirstResponder];
  326. [_moneyTextField resignFirstResponder];
  327. [_greetTextField resignFirstResponder];
  328. }
  329. @end