接上一篇基于iOS的简单计算器(一)皆为po主iOS课程的实验内容。git
高级计算器:可以进行一些高级的运算好比三角函数、阶乘、对数等。github
体质计算器:获取用户的身高体重后,反馈用户的体质指数。express
多场景切换segmentfault
高级计算器api
体质计算器app
设备锁屏ide
画图:在体质计算器中的输出结果上添加矩形边框函数
控制屏幕显示的字符串的长度spa
场景:在故事板中,场景指单一视图控制器及视图3d
场景过渡:在两个场景之间和管理两个场景的过渡。
拖动一个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;
}