第一部分:
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. MongoDB 原子操作

    mongodb不支持事务,所以,在你的项目中应用时,要注意这点.无论什么设计,都不要要求mongodb保证数据的完整性. 但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操 ...

  2. JavaScript 比较和逻辑运算符

    比较和逻辑运算符用于测试 true 或者 false. 比较运算符 比较运算符在逻辑语句中使用,以测定变量或值是否相等. 给定 x=5,下面的表格解释了比较运算符: 实例 »实例 » 大于 大于或等于 ...

  3. Dynamics CRM Trigger plugin for N:N relationships

    博客原文:https://demystifyingcrm.wordpress.com/2014/12/17/trigger-plugin-for-nn-relationships-in-dynamic ...

  4. ROS_Kinetic_28 turtlebot gazebo demo例子

    ROS_Kinetic_28 turtlebot gazebo demo例子 官方教程:http://wiki.ros.org/turtlebot_gazebo/Tutorials/indigo/Ma ...

  5. defaultdict的威力

    >>> from collections import defaultdict >>> s='mmississippi' >>> d=defaul ...

  6. 剑指Offer——小米+小红书笔试题+知识点总结

    剑指Offer--小米+小红书笔试题+知识点总结 情景回顾 时间:2016.9.23 19:00-21:00 2016.9.24 15:00-17:00 地点:山东省网络环境智能计算技术重点实验室 事 ...

  7. J2EE规范标准

    J2EE是一个很大的平台体系,提供了很多服务.程序接口.协议等.这么庞大的体系必须要由一系列的标准进行规范,不然将会一片混乱.通过这些规范好的接口来开发程序将会使程序更加强壮.更加有生命力.总的来说, ...

  8. SQLite 运算符(http://www.w3cschool.cc/sqlite/sqlite-operators.html)

    SQLite 运算符 SQLite 运算符是什么? 运算符是一个保留字或字符,主要用于 SQLite 语句的 WHERE 子句中执行操作,如比较和算术运算. 运算符用于指定 SQLite 语句中的条件 ...

  9. 字符编码(ASCII、ANSI、GB2312、UTF-8等)系统梳理

    引言 在显示器上看见的文字.图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片.假设,你用显微镜把盘片放大,会看见盘片表面凹凸不 ...

  10. 详解EBS接口开发之供应商导入补充-供应商地点增加实例

    DECLARE --v_org_id number; v_vendor_interface_id NUMBER; v_vendor_site_interface_id NUMBER; --接口表的id ...