昨晚遇到了一个让我逻辑滞空的小题目:
让storyBoard中有一个button按钮,按钮图片可以随便设定,要求点击一下按钮,按钮就要向右下角45°方向移动。要就碰到四周时,button就要向个方向的90°方向移动。以此循环,碰到四周就要求转换方向。
当时逻辑情况怎么也弄不清楚,总觉的少了好多情况。静下心来,我们来研究一下。
定义边界属性(其实也可以定义局部变量)
//button移动右边界范围x @property (nonatomic, assign) NSInteger rightRangeX; //button移动左边界范围x @property (nonatomic, assign) NSInteger leftRangeX; //button移动下边界范围y @property (nonatomic, assign) NSInteger bottomRangeY; //button移动上边界范围y @property (nonatomic, assign) NSInteger heightRangeY;
设定两个BOOL值:用来判断是否向左,或向上(也可以向下,或向右)
//判断button是否向左 @property (nonatomic,assign) BOOL isleft; //判断button是否向上 @property (nonatomic,assign) BOOL isup;
在viewDidLoad中,让BOOL值为NO,因为题目要求是右下角嘛,要跟着题目走..
- (void)viewDidLoad { [super viewDidLoad]; self.isleft = NO; self.isup = NO; // Do any additional setup after loading the view, typically from a nib. }
拖一个button方法:moveBtnClick:
- (IBAction)moveBtnClick:(UIButton *)sender { ... }
方法中获取了屏幕的大小、设置了每次移动的距离(我假象为speed)、button在各个边的临界范围
//获取屏幕大小 CGRect mainRect = [[UIScreen mainScreen] bounds]; //设置移动距离值 NSInteger speed = 10; //求出button在个边的临界范围 CGRect tempFrame = self.btnClick.frame; self.rightRangeX = mainRect.size.width - 60; self.bottomRangeY = mainRect.size.height - 60; self.leftRangeX = 0; self.heightRangeY = 0; (由于我在storyBoard中直接就设定了60 * 60 的大小,所以在求范围的时候就用了 “魔鬼数字 60”)
主逻辑:起初,我在纸上写了不下10中情况,我考虑了起初button的各个位置的情况,在if语句中嵌套了无数个if语句,结果最后把自己锁死了进去。其实无非就上下左右,先考虑左右,在左右中考虑上下。仅此而已。
if (self.isleft) { tempFrame.origin.x -= speed; if (tempFrame.origin.x < self.leftRangeX) { self.isleft = NO; tempFrame.origin.y += speed; } if (self.isup) { tempFrame.origin.y -= speed; if (tempFrame.origin.y < self.heightRangeY) { self.isup = NO; } } else { tempFrame.origin.y += speed; if (tempFrame.origin.y > self.bottomRangeY) { self.isup = YES; } } } else { tempFrame.origin.x += speed; if (tempFrame.origin.x > self.rightRangeX) { tempFrame.origin.y -= speed; self.isleft = YES; } if (self.isup) { tempFrame.origin.y -= speed; if (tempFrame.origin.y < self.heightRangeY) { self.isup = NO; } } else { tempFrame.origin.y +=speed; if (tempFrame.origin.y > self.bottomRangeY) { self.isup = YES; } } }
- 一道简单的逻辑分析问题,我却把自己锁死进去,给自己一个一个警告吧,遇到逻辑文字,静下心来,从全局入手,不要走一步分析一步,总也会有意想不到的问题发生,等走到了最后,发现自己已经走不出自己的逻辑了,挠头吧、删了重写吧、心里面乱了,就怎么都不会有任何新的进展了。
- 静下心来,从总体入手,搭建出来打的框架,往框架里面添加所需要的逻辑。到头来,读一下自己写的代码,真简单。
- 这是一道简单的逻辑问题,以后会遇到各种各样的复杂逻辑。静下心,搭出框架,走的每一步自己都知道在做什么,这样才能写出一套完美的逻辑。
上全代码:
1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @property (weak, nonatomic) IBOutlet UIButton *btnClick; 6 //button移动右边界范围x 7 @property (nonatomic, assign) NSInteger rightRangeX; 8 9 //button移动左边界范围x 10 @property (nonatomic, assign) NSInteger leftRangeX; 11 12 //button移动下边界范围y 13 @property (nonatomic, assign) NSInteger bottomRangeY; 14 15 //button移动上边界范围y 16 @property (nonatomic, assign) NSInteger heightRangeY; 17 18 //判断button是否向左 19 @property (nonatomic,assign) BOOL isleft; 20 //判断button是否向上 21 @property (nonatomic,assign) BOOL isup; 22 23 @end 24 25 @implementation ViewController 26 27 - (void)viewDidLoad { 28 [super viewDidLoad]; 29 self.isleft = NO; 30 self.isup = NO; 31 // Do any additional setup after loading the view, typically from a nib. 32 } 33 34 35 - (void)didReceiveMemoryWarning { 36 [super didReceiveMemoryWarning]; 37 // Dispose of any resources that can be recreated. 38 } 39 - (IBAction)moveBtnClick:(UIButton *)sender 40 { 41 //获取屏幕大小 42 CGRect mainRect = [[UIScreen mainScreen] bounds]; 43 44 //设置移动距离值 45 NSInteger speed = 10; 46 47 //求出button在个边的临界范围 48 CGRect tempFrame = self.btnClick.frame; 49 50 self.rightRangeX = mainRect.size.width - 60; 51 self.bottomRangeY = mainRect.size.height - 60; 52 self.leftRangeX = 0; 53 self.heightRangeY = 0; 54 55 if (self.isleft) { 56 tempFrame.origin.x -= speed; 57 if (tempFrame.origin.x < self.leftRangeX) 58 { 59 self.isleft = NO; 60 tempFrame.origin.y += speed; 61 } 62 if (self.isup) 63 { 64 tempFrame.origin.y -= speed; 65 if (tempFrame.origin.y < self.heightRangeY) 66 { 67 self.isup = NO; 68 } 69 } 70 else 71 { 72 tempFrame.origin.y += speed; 73 if (tempFrame.origin.y > self.bottomRangeY) 74 { 75 self.isup = YES; 76 } 77 } 78 } 79 else 80 { 81 tempFrame.origin.x += speed; 82 if (tempFrame.origin.x > self.rightRangeX) 83 { 84 tempFrame.origin.y -= speed; 85 self.isleft = YES; 86 } 87 if (self.isup) 88 { 89 tempFrame.origin.y -= speed; 90 if (tempFrame.origin.y < self.heightRangeY) 91 { 92 self.isup = NO; 93 } 94 } 95 else 96 { 97 tempFrame.origin.y +=speed; 98 if (tempFrame.origin.y > self.bottomRangeY) 99 { 100 self.isup = YES; 101 } 102 } 103 } 104 sender.frame = tempFrame; 105 } 106 107 108 @end
仅此。