iOS开发-舒尔特表

简介:

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

页面布局

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

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

集合演示:

按钮共用事件演示:

Demo实现

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

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

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

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

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

1
[ self  initButtonTitle];

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

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

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

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

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

设置定时器:

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

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

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

统计时间:

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

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

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

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

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

 ViewController.m中的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//
//  ViewController.m
//  TableVision
//
//  Created by keso on 15/1/18.
//  Copyright (c) 2015年 keso. All rights reserved.
//
 
#import "ViewController.h"
 
@interface  ViewController ()
@property  NSMutableArray  *resultArr;
@property  NSTimer  *timer;
@property  NSDate   *beginDate;
@end
 
@implementation  ViewController
 
- ( void )viewDidLoad {
     [ super  viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
     [ self  initButtonTitle];
     //    self.timer=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:nil userInfo:nil repeats:YES];
}
- ( void )triggerTime:( NSTimer  *)sender{
     
}
- ( void )initButtonTitle{
     //实例化结果集的可变数组
     self .resultArr=[ NSMutableArray  array];
     NSArray  *arr=[ self  getDataArray];
     for  (UIButton *button in  self .visionButtons) {
         NSString  *result=[arr[button.tag-1]stringValue];
         [button setTitle:result forState:UIControlStateNormal];
         //重新开始的时候要重新设置按钮的背景和状态
         [button setBackgroundColor:[UIColor yellowColor]];
         [button setEnabled: YES ];
     }
     [_timerLabel setText:@ "00:00" ];
     self .timer=[ NSTimer  scheduledTimerWithTimeInterval:0.1 invocation: nil  repeats: YES ];
}
- ( IBAction )oneMore:( id )sender {
     [ self  initButtonTitle];
}
 
- ( NSArray  *)getDataArray{
     //需要展示的数组
     NSMutableArray  *arr=[ NSMutableArray  array];
     for  ( NSInteger  i=1; i<10; i++) {
         [arr addObject:@(i)];
     }
     NSInteger  count=[arr count];
     //生成随机数组
     for  ( NSInteger  i=0; i<count; i++) {
         NSInteger  index=arc4random()%(count-i)+i;
         [arr exchangeObjectAtIndex:index withObjectAtIndex:i];
     }
     return  arr;
}
 
- ( IBAction )getResult:( id )sender {
     UIButton *button=(UIButton *)sender;
     //设置背景颜色
     [button setBackgroundColor:[UIColor greenColor]];
     //按钮点击一次就不再点击
     [button setEnabled: NO ];
     NSInteger  value=[[[button titleLabel] text] integerValue];
     [ self .resultArr addObject:[ NSNumber  numberWithInteger:value]];
     //点击第一个按钮之后设置开始时间
     if  ([ self .resultArr count]==1) {
         //游戏开始时间
         _beginDate=[ NSDate  date];
         //游戏开始
         [_timer fire];
     }
     NSInteger  allTime=[_timer.fireDate timeIntervalSinceDate:_beginDate];
     NSString  *timeFormat=[ NSString  stringWithFormat:@ "%02ld:%02ld" ,allTime/1000,allTime%1000];
     [_timerLabel setText:timeFormat];
     //所有的点击完成之后的调用
     if  ([ self .resultArr count]==9) {
         //销毁定时器
         [_timer invalidate];
         //弹框
         NSString  *tip;
         if  ([ self  getArrayAsc: self .resultArr]) {
             tip=@ "恭喜你,通过比赛" ;
         } else {
             tip=@ "不好意思,比赛失败" ;
         }
         //将点击的结果使用逗号进行拼接
         NSString  *resultStr=[ NSString  stringWithFormat:@ "%@" ,[ self .resultArr componentsJoinedByString:@ "," ]];
         
         UIAlertView *alterView=[[UIAlertView alloc] initWithTitle:tip message:resultStr delegate: nil  cancelButtonTitle:@ "确定"  otherButtonTitles: nil ];
         [alterView  show];
     }
}
- ( void )didReceiveMemoryWarning {
     [ super  didReceiveMemoryWarning];
     // Dispose of any resources that can be recreated.
}
//判断一个数组是不是升序
- ( BOOL )getArrayAsc:( NSArray  *)originalArr{
     for  ( NSInteger  i=0; i<[originalArr count]-1; i++) {
         if  (originalArr[i]>originalArr[i+1]) {
             return  NO ;
         }
     }
     return   YES ;
}
 
@end
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4232605.html,如需转载请自行联系原作者
相关文章
|
5天前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
115 3
|
5天前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
128 2
|
5天前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
48 0
|
5天前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
109 2
|
5天前
|
API 开发工具 Android开发
iOS 和 Android 平台的开发有哪些主要区别?
iOS与Android开发区别:iOS用Objective-C/Swift,App Store唯一下载渠道;Android用Java/Kotlin,多商店发布(如Google Play、华为市场)。设计上,iOS简洁一致,Android灵活可定制。开发工具,iOS用Xcode,Android用Android Studio。硬件和系统多样性,iOS统一,Android复杂。权限管理、审核流程及API各有特点,开发者需依据目标平台特性进行选择。
41 3
|
5天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
5天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
39 0
|
5天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
5天前
|
存储 安全 Swift
【Swift 开发专栏】使用 Swift 开发一个简单的 iOS 应用
【4月更文挑战第30天】本文介绍了使用 Swift 开发简单 iOS 待办事项应用的步骤。首先,阐述了 iOS 开发的吸引力及 Swift 语言的优势。接着,详细说明了应用的需求和设计,包括添加、查看和删除待办事项的功能。开发步骤包括创建项目、界面搭建、数据存储、功能实现,并提供了相关代码示例。最后,强调了实际开发中需注意的细节和优化,旨在帮助初学者掌握 Swift 和 iOS 开发基础。
|
5天前
|
iOS开发 开发者 UED
利用SwiftUI构建动态列表:iOS开发的新范式
【4月更文挑战第22天】在本文中,我们将深入探讨如何使用SwiftUI来创建动态列表。SwiftUI是苹果最新推出的用户界面工具集,它允许开发者以声明式的方式描述用户界面,从而简化了代码的复杂性。我们将通过具体的代码实例,展示如何利用SwiftUI的List和ForEach视图来创建动态列表,并讨论其在实际开发中的应用。
21 2