CalculatorViewController.m 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. #import "CalculatorViewController.h"
  2. #import <Masonry.h>
  3. #import "connectDeviceManager.h"
  4. #import "RSATool.h"
  5. @interface CalculatorViewController ()
  6. {
  7. UIView *bgView;/*引导视图*/
  8. }
  9. @end
  10. @implementation CalculatorViewController
  11. @synthesize pwd;
  12. #define BUTTON
  13. - (void)viewDidLoad {
  14. [super viewDidLoad];
  15. // Do any additional setup after loading the view, typically from a nib.
  16. self.view.backgroundColor=[UIColor blackColor];
  17. CGFloat mWidth=self.view.frame.size.width;
  18. CGFloat mHieght=self.view.frame.size.height;
  19. //加载button
  20. [self loadButtons:mWidth Hight:mHieght];
  21. //加载textField
  22. [self loadTextField:mWidth Hight:mHieght];
  23. //初始化Calculator
  24. _cl=[[Calculator alloc]init];
  25. /*加载引导视图*/
  26. BOOL haveOpenMask = [HWDataManager getBoolWithKey:Const_Mask_View_Open_Calcuator_Tips];
  27. if (haveOpenMask == NO){
  28. [self addGuideView];
  29. }
  30. [[connectDeviceManager shareInstance] RefreshThridMsg];
  31. }
  32. - (void)addGuideView{
  33. bgView = [[UIView alloc] init];
  34. [bgView setBackgroundColor:HW000000Color60];
  35. [self.view addSubview:bgView];
  36. [bgView mas_makeConstraints:^(MASConstraintMaker *make) {
  37. make.left.mas_equalTo(0);
  38. make.bottom.mas_equalTo(0);
  39. make.right.mas_equalTo(0);
  40. make.top.mas_equalTo(0);
  41. }];
  42. /*箭头视图*/
  43. UIImageView *flagImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"guide_open_calcu_flag1"]];
  44. [bgView addSubview:flagImageView];
  45. [flagImageView mas_makeConstraints:^(MASConstraintMaker *make) {
  46. make.right.mas_equalTo(-118.f);
  47. make.height.mas_equalTo(67);
  48. make.width.mas_equalTo(22);
  49. make.top.equalTo(_TF.mas_centerY).offset(40);
  50. }];
  51. /*不可点击btn*/
  52. UIButton *unableBtn = [[UIButton alloc] init];
  53. unableBtn.frame = CGRectMake(0, 0, 295, 64);
  54. NSString * curStr = NSLocalizedString(@"guide_set_open_calcula_guide_tips",nil);
  55. CGFloat curHeight = [curStr boundingRectWithSize:CGSizeMake(295 - 20 , 1000) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:14.f]} context:nil].size.height;
  56. if(curHeight < 50){
  57. curHeight = 50;
  58. }
  59. else{
  60. curHeight += 20;
  61. }
  62. // gradient
  63. CAGradientLayer *gl = [CAGradientLayer layer];
  64. gl.frame = CGRectMake(0,0,295,curHeight);
  65. gl.startPoint = CGPointMake(0, 0.5);
  66. gl.endPoint = CGPointMake(1, 0.5);
  67. gl.colors = @[(__bridge id)HW0CDEFDColor.CGColor, (__bridge id)HW058DFBColor.CGColor];
  68. gl.locations = @[@(0), @(1.0f)];
  69. [unableBtn.layer addSublayer:gl];
  70. [unableBtn setUserInteractionEnabled:NO];
  71. [unableBtn setTitle:curStr forState:(UIControlStateNormal)];
  72. [unableBtn setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
  73. [unableBtn.titleLabel setFont:[UIFont systemFontOfSize:14.f]];
  74. [unableBtn.titleLabel setNumberOfLines:0];
  75. [unableBtn.layer setCornerRadius:curHeight/2.0];
  76. unableBtn.clipsToBounds = YES;
  77. [bgView addSubview:unableBtn];
  78. [unableBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  79. make.right.mas_equalTo(-20*AUTOSCALE);
  80. make.width.mas_equalTo(295);
  81. make.top.equalTo(flagImageView.mas_bottom).offset(-8);
  82. make.height.mas_equalTo(curHeight);
  83. }];
  84. unableBtn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 10);
  85. UIButton *knowBtn = [[UIButton alloc] init];
  86. [knowBtn setBackgroundColor:[UIColor clearColor]];
  87. [knowBtn.layer setCornerRadius:18.f];
  88. [knowBtn.layer setBorderColor:HWFFFFFFColor.CGColor];
  89. [knowBtn.layer setBorderWidth:1];
  90. [knowBtn setTitle:NSLocalizedString(@"guide_set_pwd_guide_know",nil) forState:(UIControlStateNormal)];
  91. [knowBtn setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
  92. [knowBtn.titleLabel setFont:[UIFont systemFontOfSize:16]];
  93. [bgView addSubview:knowBtn];
  94. [knowBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  95. make.right.mas_equalTo(-29*AUTOSCALE);
  96. make.width.mas_equalTo(120);
  97. make.top.equalTo(unableBtn.mas_bottom).offset(15);
  98. make.height.mas_equalTo(36.f);
  99. }];
  100. [knowBtn addTarget:self
  101. action:@selector(knowBtnPressed)
  102. forControlEvents:(UIControlEventTouchUpInside)];
  103. }
  104. - (void)knowBtnPressed{
  105. [bgView removeFromSuperview];
  106. [HWDataManager setBoolWithKey:Const_Mask_View_Open_Calcuator_Tips value:YES];
  107. }
  108. #pragma mark ----样式设置----
  109. -(void)loadButtons:(CGFloat)mWidth Hight:(CGFloat)mHieght{
  110. CGFloat x=1;
  111. CGFloat y=mHieght-(((mWidth-5)/4)*5)-1 - 60;
  112. if(mHieght == 736 ||mHieght == 667){//修改 8P手机UI问题
  113. y += 40;
  114. }
  115. NSArray *buttonArray=@[@"C",@"+/-",@"%",@"÷",@"7",@"8",@"9",@"×",@"4",@"5",@"6",@"—",@"1",@"2",@"3",@"+",@"0",@".",@"="];
  116. NSInteger buttonArrayID=0;
  117. for (int i=0; i<5; i++) {
  118. for (int j=0; j<(i==4?3:4); j++) {
  119. UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];
  120. button.frame=CGRectMake(x, y, (buttonArrayID==16?(mWidth-5)/4*2+1 - 13:(mWidth-5)/4 - 13), (mWidth-5)/4 - 13);
  121. button.layer.cornerRadius = ((mWidth-5)/4 - 13)/2;
  122. [button setTitle:[buttonArray objectAtIndex:buttonArrayID] forState:UIControlStateNormal];
  123. button.titleLabel.font=[UIFont systemFontOfSize:40];
  124. button.tag=100+buttonArrayID;
  125. [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  126. if (buttonArrayID%4==3||buttonArrayID==[buttonArray count]-1) {
  127. button.backgroundColor=HWEFA23BColor;
  128. }else if(buttonArrayID==16){
  129. //设置 0 Button 文字向右对齐
  130. [button setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, (mWidth-5)/4)];
  131. x+=((mWidth-5)/4)+1;
  132. button.backgroundColor=HW333333Color9;
  133. }else if(buttonArrayID<3){
  134. button.backgroundColor=HWA5A5A5Color;
  135. [button setTitleColor: [UIColor blackColor] forState:UIControlStateNormal] ;
  136. }else{
  137. button.backgroundColor=HW333333Color9;
  138. }
  139. [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
  140. [self.view addSubview:button];
  141. x+=((mWidth-5)/4)+1;
  142. buttonArrayID++;
  143. }
  144. x=1;
  145. y+=((mWidth-5)/4)+1;
  146. }
  147. }
  148. -(void)loadTextField:(CGFloat)mWidth Hight:(CGFloat)mHieght{
  149. _TF=[[UITextField alloc]initWithFrame:CGRectMake(10, 50, mWidth-20, mHieght-(((mWidth-5)/4)*5)-50)];
  150. _TF.tag=1000;
  151. _TF.textColor=[UIColor whiteColor];
  152. [_TF setEnabled:NO];
  153. _TF.textAlignment=NSTextAlignmentRight;
  154. _TF.adjustsFontSizeToFitWidth=YES;//自适应宽度
  155. _TF.text=@"0";
  156. _TF.font=[UIFont fontWithName:@"HelveticaNeue-Thin" size:80];
  157. [self.view addSubview:_TF];
  158. }
  159. #pragma mark ----button响应----
  160. //button响应方法
  161. -(void)buttonAction:(UIButton *)sender{
  162. [self removeTextFieldFormat];
  163. switch (sender.tag) {
  164. case 100:
  165. //清除
  166. if ([sender.titleLabel.text isEqualToString:@"AC"]) {
  167. [self buttonSymbolStyleReduction:sender];
  168. }
  169. self.TF.text=@"0";
  170. [sender setTitle:@"AC" forState:UIControlStateNormal];
  171. [self.cl calculatorEmpty];
  172. break;
  173. case 101:
  174. //正负转换
  175. [self getPlusMinus:self.TF.text];
  176. break;
  177. case 102:
  178. //百分比
  179. [self getPercentage:self.TF.text];
  180. break;
  181. case 103:
  182. //除
  183. [self execute];
  184. self.cl.exType=1;
  185. [self buttonSymbolStyleReduction:sender];
  186. [self buttonSymbolStyle:sender];
  187. break;
  188. case 107:
  189. //乘
  190. [self execute];
  191. self.cl.exType=2;
  192. [self buttonSymbolStyleReduction:sender];
  193. [self buttonSymbolStyle:sender];
  194. break;
  195. case 111:
  196. //减
  197. [self execute];
  198. self.cl.exType=3;
  199. [self buttonSymbolStyleReduction:sender];
  200. [self buttonSymbolStyle:sender];
  201. break;
  202. case 115:
  203. //加
  204. [self execute];
  205. self.cl.exType=4;
  206. [self buttonSymbolStyleReduction:sender];
  207. [self buttonSymbolStyle:sender];
  208. break;
  209. case 117:
  210. //小数点
  211. [self decimalPoint:self.TF Button:sender];
  212. break;
  213. case 118:
  214. //等
  215. [self execute];
  216. self.cl.exType=0;
  217. [self buttonSymbolStyleReduction:sender];
  218. // self.TF.text=@"0";
  219. break;
  220. default:
  221. //判断清空计数
  222. if (self.emptyCount!=0) {
  223. self.TF.text=@"";
  224. self.emptyCount=0;
  225. }
  226. [self buttonSymbolStyleReduction:sender];
  227. [(UIButton *)[self.view viewWithTag:100] setTitle:@"C" forState:UIControlStateNormal];
  228. [self textFieldValueChange:self.TF Button:sender];
  229. break;
  230. }
  231. [self addTextFieldFormat];
  232. }
  233. #pragma mark ----样式处理----
  234. //添加点击运算符号button样式方法
  235. -(void)buttonSymbolStyle:(UIButton *)sender{
  236. [sender.layer setBorderWidth:2];
  237. }
  238. //还原运算符号button样式方法
  239. -(void)buttonSymbolStyleReduction:(UIButton *)sender{
  240. [((UIButton *)[self.view viewWithTag:103]).layer setBorderWidth:0] ;
  241. [((UIButton *)[self.view viewWithTag:107]).layer setBorderWidth:0] ;
  242. [((UIButton *)[self.view viewWithTag:111]).layer setBorderWidth:0] ;
  243. [((UIButton *)[self.view viewWithTag:115]).layer setBorderWidth:0] ;
  244. [sender.layer setBorderWidth:0];
  245. }
  246. //添加textfield格式
  247. -(void)addTextFieldFormat{
  248. NSMutableString *mutableStr=[NSMutableString stringWithString:self.TF.text];
  249. NSInteger mutableStrLength=mutableStr.length;
  250. //判断是否包含小数点 如果包含获取小数点左边的数字个数mutableStrLength
  251. if ([mutableStr containsString:@"."]) {
  252. mutableStrLength=[self getPointLeft:mutableStr];
  253. }else{
  254. mutableStrLength=[self getNumberCount:mutableStr];
  255. }
  256. for(int i=3 ; i<mutableStrLength ; i++ ){
  257. //每三个数字添加一次分隔符
  258. if (i%3==0) {
  259. //添加分隔逗号
  260. if (mutableStrLength>i) {
  261. NSInteger index=mutableStr.length-i-(mutableStr.length-mutableStrLength);
  262. NSRange range=NSMakeRange(index-1, 1);
  263. //如果上一个不是负号则添加分隔逗号
  264. if (![[mutableStr substringWithRange:range]isEqualToString:@"-"]) {
  265. //如果第一个是负号 分隔符位置+1
  266. if ([[mutableStr substringWithRange:NSMakeRange(0, 1)]isEqualToString:@"-"]) {
  267. [mutableStr insertString:@"," atIndex:index+1];
  268. }else{
  269. [mutableStr insertString:@"," atIndex:index];
  270. }
  271. }else{
  272. [mutableStr insertString:@"," atIndex:index+1];
  273. }
  274. }
  275. }
  276. }
  277. //如果textfield为空时 自动补0
  278. if ([mutableStr isEqualToString:@""]) {
  279. mutableStr=[NSMutableString stringWithString:@"0"];
  280. }
  281. self.TF.text=mutableStr;
  282. }
  283. //去除textfield格式
  284. -(void)removeTextFieldFormat{
  285. if ([self.TF.text isEqualToString:@"0"]) {
  286. self.TF.text=@"";
  287. }
  288. self.TF.text=[self.TF.text stringByReplacingOccurrencesOfString:@"," withString:@""];
  289. }
  290. //textField内容处理方法 限制输入长度 添加分隔符
  291. -(void)textFieldValueChange:(UITextField *)tf Button:(UIButton *)sender{
  292. NSString *buttonTitleStr=sender.titleLabel.text;
  293. if ([self getNumberCount:tf.text]<9) {
  294. tf.text=[tf.text stringByAppendingString:buttonTitleStr];
  295. }
  296. NSLog(@"tf.text = %@",tf.text);
  297. if(tf.text.length == 4){
  298. [self verifyPwdFun:tf.text];
  299. }
  300. // if ([tf.text isEqualToString:pwd]){
  301. // [connectDeviceManager shareInstance].isFirstInputPwdDone = YES;
  302. //
  303. // [[NSNotificationCenter defaultCenter] postNotificationName:ShowImgAndVoiceNotification object:nil];
  304. //
  305. // [self.view removeFromSuperview];
  306. // }
  307. }
  308. #pragma mark 验证密码是否正确
  309. -(void)verifyPwdFun:(NSString*)text{
  310. /*先判断本地有无设备 无设备时需要先扫码添加设备*/
  311. NSDictionary *deviceDict = [HWDataManager getObjectWithKey:Const_Have_Add_Device];
  312. if (deviceDict && [[deviceDict allKeys] containsObject:Const_Have_Add_Device_SN]){
  313. //有设备了先去做链接准备 // 80bec9c5
  314. NSString *SNStr = deviceDict[@"Const_Have_Add_Device_SN"];
  315. if(SNStr){
  316. // [[connectDeviceManager shareInstance] getThridMsgBySN:SNStr needReconnect:NO didNetEnd:^(bool didSuc) {
  317. //
  318. // if(didSuc){
  319. NSString *curPwd = nil;
  320. NSString*desPwdStr = nil;
  321. if([connectDeviceManager shareInstance].DeviceThirdIdMod.data.password
  322. && [connectDeviceManager shareInstance].DeviceThirdIdMod.data.password.length > 0){
  323. curPwd = [connectDeviceManager shareInstance].DeviceThirdIdMod.data.password;
  324. desPwdStr = [RSATool AES128Decrypt:curPwd key:AESCODEKEEYY];
  325. }
  326. else{
  327. if(deviceDict && [[deviceDict allKeys] containsObject:Const_Have_Add_Device_PWD])
  328. {
  329. desPwdStr = deviceDict[Const_Have_Add_Device_PWD];
  330. }
  331. }
  332. if ([desPwdStr isEqualToString:text]){
  333. [connectDeviceManager shareInstance].isFirstInputPwdDone = YES;
  334. [self.view removeFromSuperview];
  335. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  336. [[NSNotificationCenter defaultCenter] postNotificationName:ShowImgAndVoiceNotification object:nil];
  337. });
  338. }
  339. // }
  340. // else{
  341. //
  342. // }
  343. //
  344. // }];
  345. }
  346. }
  347. }
  348. //小数点限制方法
  349. -(void)decimalPoint:(UITextField *)tf Button:(UIButton *)sender{
  350. //判断是否已经输入小数点
  351. if (![tf.text containsString:@"."]) {
  352. tf.text=[tf.text stringByAppendingString:sender.titleLabel.text];
  353. }
  354. //判断是否直接输入小数点
  355. if([self.TF.text isEqualToString:@"."]){
  356. self.TF.text=@"0.";
  357. }
  358. }
  359. //获取小数点左边数字个数
  360. -(NSInteger)getPointLeft:(NSString *)str{
  361. NSInteger pointLeft=str.length;
  362. //判断是否包含小数点 如果包含获取小数点左边的数字个数
  363. if ([str containsString:@"."]) {
  364. NSRange range = [str rangeOfString:@"."];
  365. NSLog(@"getPointLeft=%ld",range.location);
  366. pointLeft=range.location;
  367. }
  368. //判断是否包含负号
  369. if ([str containsString:@"-"]) {
  370. pointLeft-=1;
  371. }
  372. return pointLeft;
  373. }
  374. //获取小数点右边数字个数
  375. -(NSInteger)getPointRight:(NSString *)str{
  376. NSInteger pointRight=0;
  377. //判断是否包含小数点 如果包含获取小数点右边的数字个数
  378. if ([str containsString:@"."]) {
  379. NSRange range = [str rangeOfString:@"."];
  380. NSLog(@"getPointRight=%ld",str.length- range.location);
  381. pointRight=str.length- range.location;
  382. }
  383. return pointRight;
  384. }
  385. //获取纯数字个数
  386. -(NSInteger)getNumberCount:(NSString *)str{
  387. NSInteger numberCount=str.length;
  388. //判断是否包含小数点
  389. if ([str containsString:@"."]) {
  390. numberCount-=1;
  391. }
  392. //判断是否包含负号
  393. if ([str containsString:@"-"]) {
  394. numberCount-=1;
  395. }
  396. //判断是否包含分隔逗号
  397. if ([str containsString:@","]) {
  398. if ([self getPointLeft:str]<5) {
  399. numberCount-=1;
  400. }else{
  401. numberCount-=2;
  402. }
  403. }
  404. return numberCount;
  405. }
  406. //UIColor 转UIImage
  407. - (UIImage*) createImageWithColor: (UIColor*) color{
  408. CGRect rect=CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
  409. UIGraphicsBeginImageContext(rect.size);
  410. CGContextRef context = UIGraphicsGetCurrentContext();
  411. CGContextSetFillColorWithColor(context, [color CGColor]);
  412. CGContextFillRect(context, rect);
  413. UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
  414. UIGraphicsEndImageContext();
  415. return theImage;
  416. }
  417. - (void)didReceiveMemoryWarning {
  418. [super didReceiveMemoryWarning];
  419. // Dispose of any resources that can be recreated.
  420. }
  421. #pragma mark ----运算----
  422. //正负数转换
  423. -(void)getPlusMinus:(NSString *)number{
  424. self.TF.text=[self.cl getPlusMinus:self.TF.text];
  425. [self textFieldLastValue];
  426. }
  427. //ios计算器bug
  428. //2 * 9 ÷ 目前等于18 转换正负数会变为-0
  429. //计算百分比
  430. -(void)getPercentage:(NSString *)number{
  431. number=[NSString stringWithFormat:@"%f",[number doubleValue]/100];
  432. //去除floa转换后后面多余的0
  433. self.TF.text = [NSString stringFloatHandle:number];
  434. [self textFieldLastValue];
  435. }
  436. //ios计算器bug
  437. //5 * 点击% 变成0.05 再点6 等于30 而不是0.3
  438. //判断textfield上的内容是否为上一次的运算结果 并进行赋值操作 以保证连续运算时执行以上两种操作后的结果能够正确参与运算
  439. -(void)textFieldLastValue{
  440. //如果number1和result都不为空 number2为空 并且清空计数为1(说明刚刚点击过运算符号button) 说明当前textfield上的内容为上一次的运算结果
  441. if (self.cl.number1 != nil) {
  442. if (self.cl.result != nil) {
  443. if (self.cl.number2==nil) {
  444. if (self.emptyCount==1) {
  445. self.cl.number1=self.TF.text;//将转换后的值赋给number1,以便下次运算使用
  446. }
  447. }
  448. }
  449. }
  450. }
  451. //四则运算
  452. -(void)execute{
  453. if(self.emptyCount==0){
  454. if(self.cl.number1 ==nil){
  455. self.cl.number1=self.TF.text;
  456. }else{
  457. self.cl.number2=self.TF.text;
  458. }
  459. //如果number1和number2都不为空 进行计算
  460. if (self.cl.number2 != nil && self.cl.number1 != nil) {
  461. //判断除数是否为0
  462. if([self.cl.number2 isEqualToString:@""]&&self.cl.exType==1){
  463. self.TF.text=@"错误";
  464. }else{
  465. self.TF.text=[self.cl Execute];
  466. }
  467. }
  468. //清空计数
  469. self.emptyCount=1;
  470. }
  471. }
  472. @end