CalculatorViewController.m 16 KB

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