第一部分:
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. jQuery 效果 – 滑动

    jQuery 滑动方法可使元素上下滑动. 点击这里,隐藏/显示面板 一寸光阴一寸金,因此,我们为您提供快捷易懂的学习内容. 在这里,您可以通过一种易懂的便利的模式获得您需要的任何知识. 实例 jQue ...

  2. Oracle导出表

    方法一:利用PL/SQL Developer工具导出: 菜单栏-->Tools-->Export Tables,如下图,设置相关参数即可: 方法二:可以用cmd的操作命令导出,详情请去百度 ...

  3. 计算机网络之IP协议族

    网际协议IP 与IP协议配套使用的还有三个协议: 地址解析协议 ARP   (Address Resolution Protocol) 网际控制报文协议 ICMP  (Internet Control ...

  4. Playground中格式注释语法

    类似于Ruby的ruby document,Xcode的Playground自身也提供一些嵌入文档中的格式注释的语法. 我们先定义一个简单的类: class A{ } 按住opt点击class A,你 ...

  5. windows curl命令详解

    概述 Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 软件下载 下载地址:https://cur ...

  6. ROSCon 2016视频和幻灯片发布 ROS机器人操作系统重要参考资料

    ROSCon 2016视频和幻灯片发布 By Tully Foote on 十月19,2016 7:28 AM 全部PPT下载地址:http://pan.baidu.com/s/1gf2sn2F RO ...

  7. java泛型总结(类型擦除、伪泛型、陷阱)

    JDK1.5开始实现了对泛型的支持,但是java对泛型支持的底层实现采用的是类型擦除的方式,这是一种伪泛型.这种实现方式虽然可用但有其缺陷. <Thinking in Java>的作者 B ...

  8. 【SSH系列】-- hibernate基本原理&&入门demo

        什么是hibernate?      hibernate在英文中是冬眠的意思,当冬季来临,世界万物开始准备冬眠,但是程序猿这种动物好像不冬眠,因为需求变了,要改bug,冬眠,对于对象来说就是持 ...

  9. Gazebo與ROS版本說明

    使用哪种ROS / Gazebo版本的组合 介绍 本文档提供了有关将不同版本的ROS与不同版本的Gazebo结合使用的选项的概述.建议在安装Gazebo ROS包装之前阅读它.重要!简单的分析,快速和 ...

  10. 安卓2.x的版本使用4.x的主题

    现在,还有大部分安卓开发者在开发安卓APP时使用的是2.x的SDK版本,为了兼容2.x的手机这本倒无可厚非,但最令人头痛的就是2.x版本的主题是在太丑了,这是安卓刚推出时只考虑到了实用,并没考虑到美观 ...