第一部分:
1.按钮的细节,设置背景和前景图片后,要使得背景显示出来,可以设置内边距,影响内部内容。


显示 图片+文字,用button更简单。
问题是,如果不想按钮被点击,在属性面板取消勾选User Interaction Enabled.
 
2.状态栏的颜色控制(背景色深色,将状态栏调整为白色):

/**

*  控制状态栏的样式

*

*  @return UIStatusBarStyle

*/

- (UIStatusBarStyle)preferredStatusBarStyle{

return UIStatusBarStyleLightContent;

}

3.修改应用名称:

点击工程,改完后回车,点击rename,再选择manage scheme,修改,注意都是单击。

4.代码块的制作:

<#属性名#>可以生成可以填写的提示空位。

5.点击图片方法、背景变灰的实现:

因为点击阴影也会返回,因此阴影也是一张图片。

首先在UIView上盖一张阴影UIButton。然后把头像调整到阴影上面,然后放大挪动到中间(动画)。

将某个控件置于顶层:

[self.view bringSubviewToFront:self.iconBtn];

小Tip:发现图片大小无法调整,可能是由于autolayout。

/2用*0.5表示可以提高效率。

//1.添加阴影

UIButton *cover = [[UIButton alloc] init];

cover., , , );

cover.backgroundColor = [UIColor blackColor];

cover.alpha = 0.7;

[cover addTarget:self action:@selector(smallImg) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:cover];

//2.更改阴影和头像位置

[self.view bringSubviewToFront:self.iconBtn];

//3.更改头像尺寸

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:0.5];

CGFloat iconW = self.view.frame.size.width;

CGFloat iconH = iconW;

;

CGFloat iconY = (self.view.frame.size.height -
iconH) * 0.5;

self.iconBtn.frame = CGRectMake(iconX, iconY, iconW, iconH);

[UIView commitAnimations];

6.删除已有的视图,实现图像复位,阴影消失。

调用控件的removeFromSuperview方法来删除。

做法1,给方法一个参数,使用addTarget参数设置监听:

[cover addTarget:self action:@selector(smallImg:) forControlEvents:UIControlEventTouchUpInside];

- (void)smallImg : (UIButton *)btn{

[btn removeFromSuperview];

}

做法2,让cover是一个成员变量。

cover是一个成员变量的好处:让头像这个按钮有两种动作,放大和缩小

只要在按钮函数里面判断cover是否是nil,来调用放大和缩小。

监听动画结束:

[UIView setAnimationDelegate:self];

[UIView setAnimationDidStopSelector:@selector(deleteCover)];

使用block动画:

[UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#> completion:<#^(BOOL finished)completion#>]

第一个为动画持续时间,第一个block为动画代码,第二个block为动画结束的代码(block上敲回车可生成)。

推荐使用block动画。

7.取消按钮点击变灰(头像放大缩小不需要)

在属性面板取消Highlighted Adjust Image。

8.猜图的小图标排列技巧:

先加入一个长条的UI父控件,这样只需要调整父控件就可以调整所有子控件。

添加一个view,然后在上面操作。

注意在添加答案按钮前先清空所有按钮。

for (UIView *subview in self.answerView.subviews){

[subview removeFromSuperview];

}

Tip:一个方法中不应该有太多的代码。

应该进行切割,把不同的功能放到不同的方法中去。

例如下面的代码,分割在三个方法内。

/**

*  添加正确答案

*

*  @param question 问题模型Question

*/

- (void)addAnswer:(Question *)question{

for (UIView *subview in self.answerView.subviews){

[subview removeFromSuperview];

}

int length = question.answer.length;

; i < length; i++){

UIButton *answerBtn = [[UIButton alloc] init];

[answerBtn setBackgroundImage:[UIImage imageNamed:@"btn_answer"] forState:UIControlStateNormal];

[answerBtn setBackgroundImage:[UIImage imageNamed:@"btn_answer_highlighted"] forState:UIControlStateHighlighted];

CGFloat marginMedium = 10.0;

;

;

CGFloat viewW = self.view.frame.size.width;

)*marginMedium) * 0.5;

CGFloat answerX = leftMargin + i * (answerW + marginMedium);

answerBtn., answerW, answerH);

[self.answerView addSubview:answerBtn];

}

}

/**

*  添加待选项

*

*  @param question 问题模型Question

*/

- (void)addOption:(Question *)question{

int count = question.options.count;

; i < count; i++){

UIButton *optionBtn = [[UIButton alloc] init];

[optionBtn setBackgroundImage:[UIImage imageNamed:@"btn_option"] forState:UIControlStateNormal];

[optionBtn setBackgroundImage:[UIImage imageNamed:@"btn_option_highlighted"] forState:UIControlStateHighlighted];

;

;

;

;

;

;

CGFloat viewW = self.view.frame.size.width;

;

) * marginX) * 0.5;

CGFloat optionX = leftMargin + col * (optionW + marginX);

CGFloat optionY = row * (optionH + marginY);

optionBtn.frame = CGRectMake(optionX, optionY, optionW, optionH);

[optionBtn setTitle:question.options[i] forState:UIControlStateNormal];

[optionBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

[self.optionView addSubview:optionBtn];

}

}

/**

*  设置控件数据

*

*  @param question 问题模型Question

*  @param btn      触发事件的Button(下一题按钮)

*/

- (void)setData:(Question *)question andBtn:(UIButton *)btn{

btn. ? YES : NO;

self.titlelabel.text = question.title;

,self.questions.count];

[self.iconBtn setImage:[UIImage imageNamed:question.icon] forState:UIControlStateNormal];

}

- (IBAction)nextQuestion:(id)sender {

self.index++;

UIButton *btn = (UIButton *)sender;

Question *question = self.questions[self.index];

[self setData:question andBtn:btn];

[self addAnswer:question];

[self addOption:question];

}


第二部分:


待选按钮和答案的业务逻辑:

1.要让待选按钮消失,设置hidden属性为YES即可

2.应该让答案显示在从左边开始数,第一个没有问题的框。

3.注意按钮的文字颜色默认为白色。

4.点击正确答案框的时候还要退回选项。

5.按下提示键后应该清空内容,然后显示一个正确的字。

一些细节:
1.获取按钮的标题:

NSString *answerTitle = [answerBtn titleForState:UIControlStateNormal];

另一种方法:

NSString *answerTitle = answerBtn.currentTitle;

2.延时执行:

[self performSelector:@selector(nextQuestion:) withObject:nil afterDelay:0.5];

获取已有软件的素材:

使用mac版的iTools,可以备份出来软件,是一个ipa文件,打开软件包,找PayLoad,打开素材包即可。
还可以看到一个软件用到了哪些框架。

一般流程是先实现功能,再优化代码。

要清理一个View中的所有子控件,除了用for-in来遍历使用removeFromSuperview,还可以使用subviews的方法
makeObjectsPerformSelector来为所有subview添加响应事件removeFromSuperview。

[self.answerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

一个技巧:

为了点击提示的时候可以将已经输入的退回,要实现这一步一般的思路是执行遍历,另一个思路是调用答案框按钮的点击方法,将所有的按钮都点击一次

这就相当于是退回了所有的输入选项。同样,提示的第一个字,应该相当于点击了选项中的那个字。

要多进行类似的“这个操作比较麻烦,但是相当于…”这样的思路转化。

字符串的截取:

substringToIndex:index方法表示截取到index之前,例如index=3,表示截取0-2。

字符串的判等:

isEqualToString方法。

(五)超级猜图Demo引出的细节的更多相关文章

  1. (八)喜马拉雅Demo引出的细节(代理模式和图片缩放)

    喜玛拉雅是一款电台APP,界面非常美观,通过模仿这一APP学习到很多细节. 1.图片导入后有些框内不全如何补全: 寻常的办法是再准备一张图片拖入,比较好的办法是右击已经导入的图片选择Show in F ...

  2. [Python]网络爬虫(五):urllib2的使用细节与抓站技巧

    转自:http://blog.csdn.net/pleasecallmewhy/article/details/8925978 前面说到了urllib2的简单入门,下面整理了一部分urllib2的使用 ...

  3. [Python]网络爬虫(五):urllib2的使用细节与抓站技巧(转)

    1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用代理. 新建test ...

  4. nRF5 SDK for Mesh(五) Light switch demo 点灯例子

    Light switch demo  灯开demo   Purpose This demo project consists of four sub examples - The light swit ...

  5. 自己实现简单的AOP(五)使Demo适应webApi、亦可完成属性自动注入

    在前文的Demo中,webApi的Controller是不能自动注入的,原因是 IHttpController 和 IController 是通过两个不同的途径进行激活的. IHttpControll ...

  6. iOS实现(超级猜图)源码

    //首先建立模型文件 QLLQuestion.hheQLLQuestion.m文件 #import <Foundation/Foundation.h> @interface QLLQues ...

  7. (五)backbone - DEMO - 通信录改造之使用requirejs

    DEMO介绍是 DEMO通信录的扩展,使用requirejs模块化整合 大体实现 • model文件 model/contact.js define(function (){ // user cont ...

  8. (三十八)从私人通讯录引出的细节II -数据逆传 -tableView点击 -自定义分割线

    项目中的警告是不会影响app发布的,例如引入第三方类库很容易引入警告. 细节1:跳转的数据传递. prepareForSegue: sender: 方法是在执行segue后,跳转之前调用这个方法,一般 ...

  9. (三十七)从私人通讯录引出的细节I -Notification -Segue -HUD -延时

    细节1:账号和密码都有值的时候才可以点击登录按钮,因此应该监听文本框的文本改变. 因为文本框的文本改变代理不能处理,因此应该使用通知Notification. 文本框文本改变会发出通知:通知的前两个参 ...

随机推荐

  1. windows上安装nodejs,升级npm,安装webpack指南

    安装nodejs https://nodejs.org/en/ 安装webpack和其他一些常用的 npm install -g node-gyp webpack coffee-script 监控 w ...

  2. linux C 获取与修改IP地址

    主要有两种方法: 一种是用system执行shell命令,如: system("ifconfig usb0 192.168.1.188"); 另一种用ioctl系统调用: int ...

  3. Weblogic 12c 集群环境搭建

    本文是在windows7操作系统下配置的,jdk版本1.7 ,weblogic版本12.1.3.0.0. 搭建集群前的规划 其中AdminServer是总控制端,server1.server2.ser ...

  4. Zookeeper的安装配置及基本开发

    一.简介 Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. ZooKeeper的目标就 ...

  5. Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53150322 Agenda: 一 ...

  6. springMVC源码分析--HandlerMapping(一)

    HandlerMapping的工作就是为每个请求找到合适的请求找到一个处理器handler,其实现机制简单来说就是维持了一个url到Controller关系的Map结构,其提供的实际功能也是根据req ...

  7. 联想G510F1F2..功能键和FN+功能键反过来

    进入BIOS, 将HotKey Mode 修改为Disabled,右边有详细说明:

  8. 理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最 ...

  9. 记住经典的斐波拉契递归和阶乘递归转换为while规律

    记住经典的斐波拉契递归和阶乘递归转换为while规律.它为实现更复杂转换提供了启发性思路. # 斐波拉契--树形递归 def fab(n): if n<3: return n return fa ...

  10. Github上的Android项目介绍之ListViewAnimation(针对listView item的侧滑菜单)(1)

    demo源码,需要可以下载 1.这是一个github开源项目,先去github上面下载,github下载地址. 2.将SwipeMenuListView项目,导入,然后新建项目如果要引用,要设置为相应 ...