(五)超级猜图Demo引出的细节
/**
* 控制状态栏的样式
*
* @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];
}
NSString *answerTitle = [answerBtn titleForState:UIControlStateNormal];
另一种方法:
NSString *answerTitle = answerBtn.currentTitle;
2.延时执行:
[self performSelector:@selector(nextQuestion:) withObject:nil afterDelay:0.5];
获取已有软件的素材:
[self.answerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
一个技巧:
为了点击提示的时候可以将已经输入的退回,要实现这一步一般的思路是执行遍历,另一个思路是调用答案框按钮的点击方法,将所有的按钮都点击一次
这就相当于是退回了所有的输入选项。同样,提示的第一个字,应该相当于点击了选项中的那个字。
要多进行类似的“这个操作比较麻烦,但是相当于…”这样的思路转化。
字符串的截取:
substringToIndex:index方法表示截取到index之前,例如index=3,表示截取0-2。
字符串的判等:
isEqualToString方法。
(五)超级猜图Demo引出的细节的更多相关文章
- (八)喜马拉雅Demo引出的细节(代理模式和图片缩放)
喜玛拉雅是一款电台APP,界面非常美观,通过模仿这一APP学习到很多细节. 1.图片导入后有些框内不全如何补全: 寻常的办法是再准备一张图片拖入,比较好的办法是右击已经导入的图片选择Show in F ...
- [Python]网络爬虫(五):urllib2的使用细节与抓站技巧
转自:http://blog.csdn.net/pleasecallmewhy/article/details/8925978 前面说到了urllib2的简单入门,下面整理了一部分urllib2的使用 ...
- [Python]网络爬虫(五):urllib2的使用细节与抓站技巧(转)
1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用代理. 新建test ...
- nRF5 SDK for Mesh(五) Light switch demo 点灯例子
Light switch demo 灯开demo Purpose This demo project consists of four sub examples - The light swit ...
- 自己实现简单的AOP(五)使Demo适应webApi、亦可完成属性自动注入
在前文的Demo中,webApi的Controller是不能自动注入的,原因是 IHttpController 和 IController 是通过两个不同的途径进行激活的. IHttpControll ...
- iOS实现(超级猜图)源码
//首先建立模型文件 QLLQuestion.hheQLLQuestion.m文件 #import <Foundation/Foundation.h> @interface QLLQues ...
- (五)backbone - DEMO - 通信录改造之使用requirejs
DEMO介绍是 DEMO通信录的扩展,使用requirejs模块化整合 大体实现 • model文件 model/contact.js define(function (){ // user cont ...
- (三十八)从私人通讯录引出的细节II -数据逆传 -tableView点击 -自定义分割线
项目中的警告是不会影响app发布的,例如引入第三方类库很容易引入警告. 细节1:跳转的数据传递. prepareForSegue: sender: 方法是在执行segue后,跳转之前调用这个方法,一般 ...
- (三十七)从私人通讯录引出的细节I -Notification -Segue -HUD -延时
细节1:账号和密码都有值的时候才可以点击登录按钮,因此应该监听文本框的文本改变. 因为文本框的文本改变代理不能处理,因此应该使用通知Notification. 文本框文本改变会发出通知:通知的前两个参 ...
随机推荐
- Azure AI 服务之语音识别
笔者在前文<Azure AI 服务之文本翻译>中简单介绍了 Azure 认知服务中的文本翻译 API,通过这些简单的 REST API 调用就可以轻松地进行机器翻译.如果能在程序中简单的集 ...
- Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例
上三篇文章主要是解决了概念性的补充和学习,充分结合实战来深入理解 入门实例解析 第一:provider-提供服务和相应的接口 创建DemoService接口 package com.unj.dubbo ...
- python语言学习
前段时间要做视频直播需要编写自动模块,就考虑使用python脚本语言,python的好多语法都是很独特的,比如数据类型不需要预定义,缩进的方式等,另外功能也很强大,豆瓣就是用python写的.我写的部 ...
- javap反编译命令详解&Eclipse中配置javap命令
javap命令所有参数如下图所示: javap 命令用于解析类文件.其输出取决于所用的选项.若没有使用选项,javap 将输出传递给它的类的 public 域及方法.javap 将其输出到标准输出设备 ...
- iOS下JS与OC互相调用(八)--Cordova详解+实战
扯两句,可以跳过 由于项目中Cordova相关功能一直是同事在负责,所以也没有仔细的去探究Cordova到底是怎么使用的,又是如何实现JS 与 OC 的交互.所以我基本上是从零开始研究和学习Cordo ...
- 【SSH系列】-- Hibernate持久化对象的三种状态
在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...
- 剑指Offer——咪咕笔试题+知识点总结
剑指Offer--咪咕笔试题+知识点总结 情景回顾 时间:2016.10.09 15:00-16:30 地点:山东省网络环境智能计算技术重点实验室 事件:咪咕笔试 知识点总结 1.Html设置格式贵阳 ...
- 指令汇B新闻客户端开发(四) 自动轮播条
在这个新闻客户端,我们可以看到有一个轮播页面,在这个项目中,用Handler和一个定时器来做更容易一些, 我们定义一个Handler: private Handler mHandler; 定时器的代码 ...
- ScheduledExecutorService和timer的异同
先来个传统的Timer的例子: package com.jerry.concurrency; import java.text.ParseException; import java.text.Sim ...
- 详解EBS接口开发之采购申请导入
更多内容可以参考我的博客 详解EBS接口开发之采购订单导入 http://blog.csdn.net/cai_xingyun/article/details/17114697 /*+++++++ ...