iOS开发-舒尔特表

十度 IOS 2015年12月01日 收藏

周末闲来无事,看一个概念,挺有意思的,舒尔特表,网上也有很多人写过类似的Demo,本人闲来无事也写了一下,舒尔特表听起来很高大上的样子,不过本人的理解就是一个正方形的矩阵中放的各种小格子,可以是字母,数字或者说是文字,舒尔特表可以通过动态的练习锻炼视神经末梢。心理学上用此表来研究和发展心理感知的速度,其中包括视觉定向搜索运动的速度。培养注意力集中、分配、控制能力;拓展视幅;加快视频;提高视觉的稳定性、辨别力、定向搜索能力。练习的时间越长,看表所需的时间会越短。随着练习的深入,眼球的末梢视觉能力提高,不仅初学者可以有效地拓展视幅,加快阅读节奏,锻炼眼睛快速认读;而且对于进入提高阶段之后,同时拓展纵横视幅,达到一目十行、一目一页非常有效。每表按字符顺序,迅速找全所有的字符,平均1个字符用1秒钟成绩为优良,即9格用9秒、16格用16秒、25格用25秒。(百度百科)

页面布局

根据上面的概念,大概页面布局就是3*3的九宫格,一般是选择数字练习,也没有特别的多弄弄,Main.storyBoard的布局如下:

需要将所有的按钮弄成一个集合,还有就是所有按钮共用一个事件:

集合演示:

按钮共用事件演示:

Demo实现

上面中的界面主要都是数字1,因此需要的一个方法生成一个随机的数组,方法如下,生成一个随机不重复的数组大概的规则就是首先顶一个数组,之后的话,需要将数组打乱,使用随机数随机生成索引即可

  1. - (NSArray *)getDataArray{
  2. //需要展示的数组
  3. NSMutableArray *arr=[NSMutableArray array];
  4. for (NSInteger i=1; i<10; i++) {
  5. [arr addObject:@(i)];
  6. }
  7. NSInteger count=[arr count];
  8. //生成随机数组
  9. for (NSInteger i=0; i<count; i++) {
  10. NSInteger index=arc4random()%(count-i)+i;
  11. [arr exchangeObjectAtIndex:index withObjectAtIndex:i];
  12. }
  13. return arr;
  14. }

将数组中的值赋值给页面的按钮:

  1. - (void)initButtonTitle{
  2. //实例化结果集的可变数组
  3. self.resultArr=[NSMutableArray array];
  4. NSArray *arr=[self getDataArray];
  5. for (UIButton *button in self.visionButtons) {
  6. NSString *result=[arr[button.tag-1]stringValue];
  7. [button setTitle:result forState:UIControlStateNormal];
  8. //重新开始的时候要重新设置按钮的背景和状态
  9. [button setBackgroundColor:[UIColor yellowColor]];
  10. [button setEnabled:YES];
  11. }
  12. [_timerLabel setText:@"00:00"];
  13. self.timer=[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:nil repeats:YES];
  14. }

在viewDidLoad启动的时候调用对应的程序:

  1. [self initButtonTitle];

 这个时候看到页面的布局应该是这样的:

做到这一步基本上这个程序完成差不多了,然后就是计时,完成之后统计,闲来看下具体的效果,然后看代码可能会更好一点:

功能基本上就是设置按钮的背景颜色,是否可以点击,计时,清零,弹框,显示之前点击的结果,一步一步的分析:

定义成员变量计时和存储结果:

  1. @interface ViewController ()
  2. @property NSMutableArray *resultArr;
  3. @property NSTimer *timer;
  4. @property NSDate *beginDate;
  5. @end

设置定时器:

  1. self.timer=[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:nil repeats:YES];

设置按钮的背景颜色和显隐:

  1. [button setBackgroundColor:[UIColor yellowColor]];
  2. [button setEnabled:YES];

统计时间:

  1. NSInteger allTime=[_timer.fireDate timeIntervalSinceDate:_beginDate];
  2. NSString *timeFormat=[NSString stringWithFormat:@"%02ld:%02ld",allTime/1000,allTime%1000];
  3. [_timerLabel setText:timeFormat];

判断结果,如果所有的结果是升序的那么是成功的,否则就是失败的:

  1. //判断一个数组是不是升序
  2. - (BOOL)getArrayAsc:(NSArray *)originalArr{
  3. for (NSInteger i=0; i<[originalArr count]-1; i++) {
  4. if (originalArr[i]>originalArr[i+1]) {
  5. return NO;
  6. }
  7. }
  8. return YES;
  9. }

所有按钮的点击事件如下:

  1. - (IBAction)getResult:(id)sender {
  2. UIButton *button=(UIButton *)sender;
  3. //设置背景颜色
  4. [button setBackgroundColor:[UIColor greenColor]];
  5. //按钮点击一次就不再点击
  6. [button setEnabled:NO];
  7. NSInteger value=[[[button titleLabel] text] integerValue];
  8. [self.resultArr addObject:[NSNumber numberWithInteger:value]];
  9. //点击第一个按钮之后设置开始时间
  10. if ([self.resultArr count]==1) {
  11. //游戏开始时间
  12. _beginDate=[NSDate date];
  13. //游戏开始
  14. [_timer fire];
  15. }
  16. NSInteger allTime=[_timer.fireDate timeIntervalSinceDate:_beginDate];
  17. NSString *timeFormat=[NSString stringWithFormat:@"%02ld:%02ld",allTime/1000,allTime%1000];
  18. [_timerLabel setText:timeFormat];
  19. //所有的点击完成之后的调用
  20. if ([self.resultArr count]==9) {
  21. //销毁定时器
  22. [_timer invalidate];
  23. //弹框
  24. NSString *tip;
  25. if ([self getArrayAsc:self.resultArr]) {
  26. tip=@"恭喜你,通过比赛";
  27. }else{
  28. tip=@"不好意思,比赛失败";
  29. }
  30. //将点击的结果使用逗号进行拼接
  31. NSString *resultStr=[NSString stringWithFormat:@"%@",[self.resultArr componentsJoinedByString:@","]];
  32. UIAlertView *alterView=[[UIAlertView alloc] initWithTitle:tip message:resultStr delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
  33. [alterView show];
  34. }
  35. }

 ViewController.m中的代码:

  1. //
  2. // ViewController.m
  3. // TableVision
  4. //
  5. // Created by keso on 15/1/18.
  6. // Copyright (c) 2015年 keso. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10.  
  11. @interface ViewController ()
  12. @property NSMutableArray *resultArr;
  13. @property NSTimer *timer;
  14. @property NSDate *beginDate;
  15. @end
  16.  
  17. @implementation ViewController
  18.  
  19. - (void)viewDidLoad {
  20. [super viewDidLoad];
  21. // Do any additional setup after loading the view, typically from a nib.
  22. [self initButtonTitle];
  23. // self.timer=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:nil userInfo:nil repeats:YES];
  24. }
  25. - (void)triggerTime:(NSTimer *)sender{
  26. }
  27. - (void)initButtonTitle{
  28. //实例化结果集的可变数组
  29. self.resultArr=[NSMutableArray array];
  30. NSArray *arr=[self getDataArray];
  31. for (UIButton *button in self.visionButtons) {
  32. NSString *result=[arr[button.tag-1]stringValue];
  33. [button setTitle:result forState:UIControlStateNormal];
  34. //重新开始的时候要重新设置按钮的背景和状态
  35. [button setBackgroundColor:[UIColor yellowColor]];
  36. [button setEnabled:YES];
  37. }
  38. [_timerLabel setText:@"00:00"];
  39. self.timer=[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:nil repeats:YES];
  40. }
  41. - (IBAction)oneMore:(id)sender {
  42. [self initButtonTitle];
  43. }
  44.  
  45. - (NSArray *)getDataArray{
  46. //需要展示的数组
  47. NSMutableArray *arr=[NSMutableArray array];
  48. for (NSInteger i=1; i<10; i++) {
  49. [arr addObject:@(i)];
  50. }
  51. NSInteger count=[arr count];
  52. //生成随机数组
  53. for (NSInteger i=0; i<count; i++) {
  54. NSInteger index=arc4random()%(count-i)+i;
  55. [arr exchangeObjectAtIndex:index withObjectAtIndex:i];
  56. }
  57. return arr;
  58. }
  59.  
  60. - (IBAction)getResult:(id)sender {
  61. UIButton *button=(UIButton *)sender;
  62. //设置背景颜色
  63. [button setBackgroundColor:[UIColor greenColor]];
  64. //按钮点击一次就不再点击
  65. [button setEnabled:NO];
  66. NSInteger value=[[[button titleLabel] text] integerValue];
  67. [self.resultArr addObject:[NSNumber numberWithInteger:value]];
  68. //点击第一个按钮之后设置开始时间
  69. if ([self.resultArr count]==1) {
  70. //游戏开始时间
  71. _beginDate=[NSDate date];
  72. //游戏开始
  73. [_timer fire];
  74. }
  75. NSInteger allTime=[_timer.fireDate timeIntervalSinceDate:_beginDate];
  76. NSString *timeFormat=[NSString stringWithFormat:@"%02ld:%02ld",allTime/1000,allTime%1000];
  77. [_timerLabel setText:timeFormat];
  78. //所有的点击完成之后的调用
  79. if ([self.resultArr count]==9) {
  80. //销毁定时器
  81. [_timer invalidate];
  82. //弹框
  83. NSString *tip;
  84. if ([self getArrayAsc:self.resultArr]) {
  85. tip=@"恭喜你,通过比赛";
  86. }else{
  87. tip=@"不好意思,比赛失败";
  88. }
  89. //将点击的结果使用逗号进行拼接
  90. NSString *resultStr=[NSString stringWithFormat:@"%@",[self.resultArr componentsJoinedByString:@","]];
  91. UIAlertView *alterView=[[UIAlertView alloc] initWithTitle:tip message:resultStr delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
  92. [alterView show];
  93. }
  94. }
  95. - (void)didReceiveMemoryWarning {
  96. [super didReceiveMemoryWarning];
  97. // Dispose of any resources that can be recreated.
  98. }
  99. //判断一个数组是不是升序
  100. - (BOOL)getArrayAsc:(NSArray *)originalArr{
  101. for (NSInteger i=0; i<[originalArr count]-1; i++) {
  102. if (originalArr[i]>originalArr[i+1]) {
  103. return NO;
  104. }
  105. }
  106. return YES;
  107. }
  108.  
  109. @end