资讯专栏INFORMATION COLUMN

基于iOS的简单计算器(二)

Barrior / 745人阅读

摘要:接上一篇基于的简单计算器一皆为主课程的实验内容。体质计算器获取用户的身高体重后,反馈用户的体质指数。由于可以用之前写好的类,所以新建的类继承自该类,然后只要再添加一些用于高级计算的方法即可。

接上一篇基于iOS的简单计算器(一)皆为po主iOS课程的实验内容。

新增界面

高级计算器:能够进行一些高级的运算比如三角函数、阶乘、对数等。

体质计算器:获取用户的身高体重后,反馈用户的体质指数。

需要完成的功能

多场景切换

高级计算器

体质计算器

设备锁屏

画图:在体质计算器中的输出结果上添加矩形边框

控制屏幕显示的字符串的长度

多场景切换

场景:在故事板中,场景指单一视图控制器及视图

场景过渡:在两个场景之间和管理两个场景的过渡。

拖动一个ViewController

新建一个UIViewController类SecondViewController,与前面的ViewController建立联系

为了在两个视图控制器之间通讯,设定的用于高级计算的类的实例应该放在声明之中//在.m文件中的话是private的

设定一个属性screen,用于在视图控制器之间通讯

添加导航控制器Navigation Controller,建立导航控制器和已经做好的两个视图控制器的联系。注意:使用导航控制器做场景过渡,只能选择push

注意:在segue发起的时候,要做一些准备工作://为了数据传递

选中一个segue,先对其命名//可能有多个场景切换,需要判断是哪个

在第一个场景中覆盖prepareForSegue:方法。
以下代码的大意是,我们先做判断,如果该场景过渡是要进入高级计算器的视图,则将第一个场景的advancedCalculator实例对象传给第二个场景//注意要导入第二个视图控制器的头文件

                          
             -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
          {
              //把advanced的实例对象传给第二个场景
              if ([segue.identifier isEqualToString:@"SecondScene"]){//判断是否是第二个场景
                  if ([segue.destinationViewController isKindOfClass:[SecondViewController class]]) {//判断目的视图控制器
                      SecondViewController *svc = (SecondViewController *)segue.destinationViewController;
                      svc.calculator = self.calculator;//仅传递了内容
                  }
              }    
          }
          

在两个视图控制器中,都要将结果显示在屏幕中,所以在两个视图控制器的viewWillAppear方法中,都要添加如下代码

       self.inputText.text = self.calculator.screen;//从另一个场景传递回来
     

注意,每次计算之后,既要修改屏幕上输出的值,也要修改用于传递的screen属性的值

高级计算器

添加一个高级计算的界面

添加一个用于高级计算的Model。由于可以用之前写好的Calculate类,所以新建的类继承自该类,然后只要再添加一些用于高级计算的方法即可。实现高级计算的方法很多,这里用的是C语言的math库中的函数

诸如括号、e、pi之类的按钮,由于我们需要获取按钮上的值,来显示在结果上,所以我们需要建立outlet连接

如何识别按钮并执行其对应的方法?有很多方式:可以每个按钮都添加一个action,也可以只添加一个action,但是给按钮添加tag值,以识别不同的按钮。比如若只添加一个action,给abs按钮tag设为4,然后按下按钮时,若检测到tag=4,则执行下面的代码。

   if (sender.tag == 4) {
       self.inputText.text = [self.calculator abs:self.calculator.input];        
       NSMutableString *tempStr = [NSMutableString stringWithString:self.inputText.text];
       self.calculator.input = tempStr;
       self.calculator.screen = tempStr;
   }

在按下某个按钮的时候,就调用它在模型中对应的方法。

体质计算器

添加界面,拖一个视图控制器,添加身高体重的输入域,以获取用户的身高体重值用于体质计算

新建一个UIViewController类,与1中的视图控制器建立联系

建立相应的model,可以继承Calculate类,也可以使用类别(category)。这里使用类别的方法,类别并不是新建一个类,只是在原来的类的基础上扩展一些方法,所以在类别中只能添加方法,不能添加属性。//这里主要用的MVC的思想,业务逻辑和视图分开

   -(NSString *)computeHealthBMI:(NSString *)height weight:(NSString *)weight
   {
       NSMutableString *expression;
       expression = [NSMutableString stringWithString:weight];
       [expression appendString:@"/(("];
       [expression appendString:height];
       [expression appendString:@"/100.0)"];
       [expression appendString:@"*("];
       [expression appendString:height];
       [expression appendString:@"/100.0))="];
       self.input = expression;
       NSLog(@"health compute, input is %@", self.input);
       NSLog(@"health compute, expression is %@", expression);  
       return [NSString stringWithFormat:@"%.2f", [[self ExpressionCalculate:self.input] floatValue]];
   }

注意最后还添加一个等号的原因是,我之前写的Calculate类中的计算方法中,是用等号做符号识别的。

设备锁屏

设备锁屏可以用代码的方法,不过我折腾了半天没搞出来,后来直接在general中把它关掉了

添加矩形边框

这主要涉及到在UIView上画图了,两个问题需要解决,怎么画一个矩形以及怎么在一个View上画图。

画图方式
首先,新建一个类继承UIView类,如drawRectView,要在该类中覆盖drawRect方法;

然后,在drawRect中画出矩形;
最后,将画图的视图控制器绑定新建的这个drawRectView。

画矩形//代码是找的别人的,还没有细细研究过,这块待补2015.1.11补
画图的代码参考的是斯坦福白胡子大叔的课里面的内容,在第七课。大致的意思,先定义了factor,目的是不管我们的视图怎么变化,都能按相同的比例、位置在view上画图。self.bounds是你在你自己的视图用自己的代码绘制时使用的矩形。具体的下次写白胡子大叔的assignment再细说(po主又是一堆死线压身(╥﹏╥)

#define DEFAULT_FACE_CARD_SCALE_FACTOR 0.90
#define CORNER_FONT_STANDARD_HEIGHT 180.0
#define CORNER_RADIUS 12

(CGFloat)cornerScaleFacctor { return self.bounds.size.height / CORNER_FONT_STANDARD_HEIGHT; }

(CGFloat)cornerRadius { return CORNER_RADIUS * [self cornerScaleFacctor]; }

(CGFloat)cornerOffset { return [self cornerRadius] / 3.0; }

-(void)drawRect:(CGRect)rect{

UIBezierPath *roundedRect = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:[self cornerRadius]];
[roundedRect addClip];
[[UIColor whiteColor] setStroke];   
[roundedRect stroke];   

}

(void)setup
{

self.backgroundColor = nil; //don"t draw background
self.opaque = NO;
self.contentMode = UIViewContentModeRedraw;//bounds change call drawRect

}

(void)awakeFromNib
{

[self setup];
[self setNeedsDisplay];   

}

控制屏幕长度

//我感觉我的方式很不优雅...

屏幕上的输出是通过按按钮的操作来改变的,所以应该在touchButton的这个action方法中修改。

另外,屏幕的输出是保存在inputText.text中的,但是之前的代码会用inputText.text来赋值,要控制屏幕的输出长度的话就要避免用它来赋值。

最后,用了一个magic number(所以说不优雅嘛),观察之后发现长度为13刚好能够不自动缩小(其实这个好像可以修改textfield的属性来控制),然后就按此分成了两种情况处理。

if ([[[sender titleLabel] text] isEqualToString:@"×"]) {

   [self.calculator.input appendString:@"*"];
   

}else if([[[sender titleLabel] text] isEqualToString:@"÷"]){

   [self.calculator.input appendString:@"/"];

}else

   [self.calculator.input appendString:[[sender titleLabel] text]];

if (self.inputText.text.length == 13) {//将屏幕长度控制在13

   NSMutableString *str = [NSMutableString stringWithString:self.calculator.input];
   NSLog(@"inputtxt=13, str is %@", str);
   self.calculator.screen = str;
   self.inputText.text = [str substringWithRange:NSMakeRange(str.length - 13, 13)];

}else{//屏幕长度未超出13

   NSMutableString *str = [NSMutableString stringWithString:self.inputText.text];
   [str appendString:[[sender titleLabel] text]];
   NSLog(@"inputtxt<13, str is %@", str);
   self.calculator.screen = str;
   self.inputText.text = str;

}

效果图

完整代码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/15638.html

相关文章

  • ios开发

    摘要:谈谈分享邀请奖励机制附实现代码从产品和代码封装两个角度讲述了分享邀请机制已经洗干净了就等你来关于的一些总结微信逆向实战自动抢红包修改步数防止消息撤回实现非越狱下微信自动抢红包修改步数防止消息撤回数字切换动效根据原型高度还原的一个动效作品。 基于 KVO Hook 来对页面交互性能进行监控 基于 KVO Hook 来对页面交互性能进行监控 iOS 客户端 HTTPS 防中间人攻击实践 写...

    waruqi 评论0 收藏0
  • 图像技术在直播中应用(下)——图像识别

    摘要:在图像技术在直播中的应用上中,我们简述了美颜技术的原理与实践问题。二图像识别的一些具体实现以智能鉴黄为例当们我们具备了相关的深度学习技术后,就可以在服务端上构建应用了。 在《图像技术在直播中的应用(上)》中,我们简述了美颜技术1.0的原理与实践问题。在文章的最后,我们提到了美颜2.0最关键的技术——人脸识别。这是项复杂但又非常热门的技术,我们将在这篇文章中聊一聊图像识别,其原理与具体实...

    sanyang 评论0 收藏0
  • 图像技术在直播中应用(下)——图像识别

    摘要:在图像技术在直播中的应用上中,我们简述了美颜技术的原理与实践问题。二图像识别的一些具体实现以智能鉴黄为例当们我们具备了相关的深度学习技术后,就可以在服务端上构建应用了。 在《图像技术在直播中的应用(上)》中,我们简述了美颜技术1.0的原理与实践问题。在文章的最后,我们提到了美颜2.0最关键的技术——人脸识别。这是项复杂但又非常热门的技术,我们将在这篇文章中聊一聊图像识别,其原理与具体实...

    Tonny 评论0 收藏0
  • MySQL性能调优与架构设计(五)—— 影响MySQL Server性能相关因素

    摘要:要么因为并发的问题造成统计结果不准确,要么因为锁资源争用严重造成整体性能的下降。所以我们应该从应用程序着手分析一个应用程序架构的不同设计对整个系统性能的影响更合适。而类型数据的处理性能要远比类型数据的处理性能低下很多。 前言 大部分人通常认为一个数据库应用系统的性能瓶颈,最容易出现在数据的操作方面,而数据库应用系统的大部分数据操作都是通过数据库管理软件所提供的相关的接口完成。所以,数...

    hiyayiji 评论0 收藏0
  • 什么是大数据

    一、什么是大数据进入本世纪以来,尤其是2010年之后,随着互联网特别是移动互联网的发展,数据的增长呈爆炸趋势,已经很难估计全世界的电子设备中存储的数据到底有多少,描述数据系统的数据量的计量单位从MB(1MB大约等于一百万字节)、GB(1024MB)、TB(1024GB),一直向上攀升,目前,PB(等于1024TB)级的数据系统已经很常见,随着移动个人数据、社交网站、科学计算、证券交易、网站日志、传...

    learn_shifeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<