20130829ios cocos2d下拉列表的向上弹出实现(ios开发遇到的frame的问题)
前几天仔细区分了ios中frame,bounds,center之间的关系。
Frame:边框矩形,是视图相对于其父坐标的位置和大小
Bounds:边界矩形,是本地坐标系统(一般较少使用)
Center:边框矩形的中心点。
今天在工作中需要用到下拉列表,就参考这片文章,在自己的view中加入一个下拉列表:http://disanji.net/2011/02/20/iphone-uipickerview/。但是任务的需求是下拉列表是往上弹出而不是往下弹出,这就涉及到了frame的问题了,因为frame我没有掌握好,这个问题耽误了我三四个小时才解决。
这个下拉列表主要由两个部分组成:一个是UITextFieldView,另一个是UITableView。我按照上面的教程把它们封装到一个继承于UIView的类:DropDownList。然后我在另外一个主view中定义了DropDownList并且把DropDownList加入到我的主view中。
我的DropDownList类的初始化以及加入到子类中是这样实现的:
downList=[[[DropDownList alloc]initWithFrame:CGRectMake(, , , )]autorelease];
[[[CCDirector sharedDirector]view]addSubview:downList];
在DropDownList中另外两个控件的initwithframe初始化是这样的
-(id)initWithFrame:(CGRect)frame
{
if(self=[super initWithFrame:frame]){
//默认的下拉列表中的数据
list=[[NSArray alloc]initWithObjects:@"",@"",@"",@"",@"saul",@"kevin",@"kely",nil]; borderStyle=UITextBorderStyleRoundedRect; showList=NO; //默认不显示下拉框
oldFrame=frame; //未下拉时控件初始大小
//当下拉框显示时,计算出控件的大小。
newFrame=CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height*); lineColor=[UIColor lightGrayColor];//默认列表边框线为灰色
listBgColor=[UIColor whiteColor];//默认列表框背景色为白色
lineWidth=; //默认列表边框粗细为1 //把背景色设置为透明色,否则会有一个黑色的边
self.backgroundColor=[UIColor clearColor];
//pushlist
listView=[[UITableView alloc]initWithFrame:
CGRectMake(lineWidth,oldFrame.size.height+lineWidth,
oldFrame.size.width-lineWidth*,
oldFrame.size.height*-lineWidth*)];
listView.dataSource=self;
listView.delegate=self;
listView.backgroundColor=listBgColor;
listView.separatorColor=lineColor;
listView.hidden=!showList;//一开始listView是隐藏的,此后根据showList的值显示或隐藏 [self addSubview:listView];
[listView release]; //textField
textField=[[UITextField alloc]
initWithFrame:CGRectMake(, ,
oldFrame.size.width,
oldFrame.size.height)];
// initWithFrame:CGRectMake(0, oldFrame.size.height*4, oldFrame.size.width, oldFrame.size.height)];
textField.borderStyle=borderStyle;//设置文本框的边框风格
textField.enabled=FALSE;
[self addSubview:textField];
[textField addTarget:self action:@selector(dropdown) forControlEvents:UIControlEventAllTouchEvents]; textFieldText=[[NSString alloc]init];
}
return self;
}
下面就是处理点击UITextField的代码
-(BOOL)showList{//setShowList:No为隐藏,setShowList:Yes为显示
returnshowList;
}
-(void)setShowList:(BOOL)b{
showList=b;
NSLog(@"showlist is set ");
if(showList){
self.frame=newFrame;
}else {
self.frame=oldFrame;
}
listView.hidden=!b;
}
我想把弹出列表从上面弹出,是改写了listview控件的初始化的区域,
CGRectMake(lineWidth,oldFrame.size.height+lineWidth, oldFrame.size.width-lineWidth*,oldFrame.size.height*-lineWidth*)];
虽然可以向上弹出了,但是弹出的列表无法响应点击事件,后来又改了DropDownList类的initwithframe的方法,但是反而显示不正确了。然后就越改越乱,忽然想起来frame是相对于父类的位置。就仔细分析了一下。原来的无法响应点击事件是因为我的UITableView往原点的上方,超出了初始化的view的区域,所以无法响应。要想UITableView向上弹出,就得把UITableView的初始化区域定义在UITextField的上面。但是这样一来又有问题了:UITextField又不响应点击事件了,原来是我一开始定义的区域是oldFrame=frame,只有一个CGRectMake(frame.origin.x,frame.origin.y,frame.size.width,frame.size.height)大小,而UITextField是定义在UITableView的下面,等于说在一开始初始化的时候,UITextField又跑到类DropDownList的frame外面去了。最后想起来还是动态的定义类DropDownList的frame的大小和两个控件的位置吧。
-(void)setShowList:(BOOL)b{
showList=b;
NSLog(@"showlist is set ");
if(showList){
self.frame=newFrame;
CGRect listFrame = CGRectMake(lineWidth,lineWidth*,
oldFrame.size.width-lineWidth*,
oldFrame.size.height*-lineWidth*);
listView.frame=listFrame;
CGRect textFrame =CGRectMake(, oldFrame.size.height*, oldFrame.size.width, oldFrame.size.height);
textField.frame=textFrame;
}else {
self.frame=oldFrame;
CGRect textFrame =CGRectMake(, , oldFrame.size.width, oldFrame.size.height);
textField.frame=textFrame;
}
listView.hidden=!b;
[self setNeedsDisplay];
}
今天遇到的第二个问题:
如果类中定义了一个变量,而又只写了@property,没有写@synthesize的话,我们要是通过.运算符得到其变量会得到不正确的null,这个问题也让我调试了一个小时。@@
还有,object c中的release只是让其引用减一,而不是真正的像C++那样release掉
20130829ios cocos2d下拉列表的向上弹出实现(ios开发遇到的frame的问题)的更多相关文章
- 向上弹出菜单jQuery插件
插件名:柯乐义英文名:Keleyijs文件名称:jquery.keleyi.js插件功能:该插件可以让你轻易地在页面上构建一个向上弹出的二级菜单. 示例查看:http://keleyi.com/kel ...
- 基于jQuery打造的选项卡向上弹出jquery焦点图切换特效
基于jQuery打造的选项卡向上弹出jquery焦点图切换特效 鼠标经过标题栏,会出现层特效向上滑动,并且在同时进行幻灯片切换,效果十分不错. 有兴趣的童鞋可以下载看看,在IE6方面兼容性也不错,只有 ...
- 从页面底部向上弹出dialog,消失时逐渐向下(转)
我想实现一个效果,从底部向上逐渐弹出.如下图所示: 1.点击 显示 按钮时,一个dialog对话框从底部慢慢向上弹出. 2.关闭dialog时, dialog缓慢的移动向底部消失.很平滑的效果. ...
- android开发(31) 动画演示 - 从页面底部向上弹出dialog,消失时逐渐向下
我想实现一个效果,从底部向上逐渐弹出.如下图所示: 1.点击 显示 按钮时,一个dialog对话框从底部慢慢向上弹出. 2.关闭dialog时, dialog缓慢的移动向底部消失.很平滑的效果. ...
- cocos2d 场景切换和弹出场景、收回场景
场景弹出收回很简单 用以下代码在任意一个地方显示“设置场景”: [[CCDirector sharedDirector] pushScene:[Settings scene]]; 如果你身处“设置场景 ...
- Selenium(八):其他操作元素的方法、冻结界面、弹出对话框、开发技巧
1. 其他操作元素的方法 之前我们对web元素做的操作主要是:选择元素,然后点击元素或者输入字符串. 还有没有其他的操作了呢?有. 比如:比如鼠标右键点击.双击.移动鼠标到某个元素.鼠标拖拽等. 这些 ...
- [RN] React Native 封装选择弹出框(ios&android)
之前看到react-native-image-picker中自带了一个选择器,可以选择拍照还是图库,但我们的项目中有多处用到这个选择弹出框,所以就自己写了一下,最最重要的是ios和Android通用. ...
- C# winform 窗体从右下角向上弹出窗口效果
参考自 http://blog.csdn.net/yilan8002/article/details/7197981 /// <summary> /// 窗体动画函数 注意:要引用Syst ...
- FloatingActionMenu 向上弹出菜单
本人在github上找到了一个FloatingActionsMenu,精简了其效果(原效果有上下左右四个方向)仅仅保留向上的效果,并做了一定的优化. github上的源代码:地址 ,精简后的源代码地址 ...
随机推荐
- Points on Plane Codeforces - 576C
https://www.luogu.org/problemnew/show/CF576C 看题面,一眼按莫队的方法排一下 直接交就会和我一样发现WA掉了... 算一下会发现,上限是3e9(块内左端点1 ...
- Java EE学习笔记(二)
Spring中的Bean 1.Bean的配置: a).Bean的本质就是Java中的类,而Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理Bean . b).S ...
- DB2 错误码解析
DB2 错误代码大全——SQLSTATE 消息 SQLSTATE 消息本节列示 SQLSTATE 及其含义.SQLSTATE 是按类代码进行分组的:对于子代码,请参阅相应的表. 表 2. SQLS ...
- POJ - 2186 Popular Cows tarjain模板题
http://poj.org/problem?id=2186 首先求出所有的强连通分量,分好块.然后对于每一个强连通分量,都标记下他们的出度.那么只有出度是0 的块才有可能是答案,为什么呢?因为既然你 ...
- 正则表达式匹配URL——给URL地址加上<a> 链接
<?php function replace_url ($content) { if (empty($content)) return; //给URL地址加上 <a> 链接 $pre ...
- Java语言中自动生成随机数
参考原文:http://zhidao.baidu.com/link?url=nB3BT69wmUAiSPfKGgK5Q7HOFFP9AIE04AthreRd9yYcwKhUQsQRWlMdMhW1Qm ...
- Java中IO流文件读取、写入和复制
//构造文件File类 File f=new File(fileName); //判断是否为目录 f.isDirectory(); //获取目录下的文件名 String[] fileName=f.li ...
- mongodb 文本索引
启用文本搜索: 最初文本搜索是一个实验性功能,但2.6版本开始,配置是默认启用的.但是,如果使用的是以前 MongoDB 的版本,那么必须启用文本搜索,使用下面的代码: >db.adminCom ...
- .NET Core 1.0 CentOS7 尝试(三、使用VSCode创建一个Web应用)
参考地址:https://docs.asp.net/en/latest/tutorials/your-first-mac-aspnet.html 一.使用VSCode创建一个目录FirstWebApp ...
- poj2135 最小费用流
添加超级源点(与点1之间的边容量为2,权值为0)和超级汇点(与点N之间的边容量为2,权值为0),求流量为2的最小费用流.注意是双向边. #include <iostream> #inclu ...