代码如下:
#import
<UIKit/UIKit.h>
@interface
DropDownList : UIView<UITableViewDelegate,UITableViewDataSource> {
UITextField* textField;
//
文本输入框
NSArray* list;
//
下拉列表数据
BOOL
showList;
//
是否弹出下拉列表
UITableView* listView;
//
下拉列表
CGRect oldFrame,newFrame;
//
整个控件(包括下拉前和下拉后)的矩形
UIColor *lineColor,*listBgColor;
//
下拉框的边框色、背景色
CGFloat lineWidth;
//
下拉框边框粗细
UITextBorderStyle borderStyle;
//
文本框边框
style
}
@property
(
nonatomic
,
retain
)UITextField *textField;
@property
(
nonatomic
,
retain
)NSArray* list;
@property
(
nonatomic
,
retain
)UITableView* listView;
@property
(
nonatomic
,
retain
)UIColor *lineColor,*listBgColor;
@property
(
nonatomic
,
assign
)UITextBorderStyle borderStyle;
-(
void
)drawView;
-(
void
)setShowList:(
BOOL
)b;
@end
#import
"DropDownList.h"
@implementation
DropDownList
@synthesize
textField,list,listView,lineColor,listBgColor,borderStyle;
- (
id
)initWithFrame:(CGRect)frame {
if
(
self
=[
super
initWithFrame:frame]){
//默认的下拉列表中的数据
list=[[NSArray alloc]initWithObjects:
@"1"
,
@"2"
,
@"3"
,
@"4"
,
nil
];
borderStyle=UITextBorderStyleRoundedRect;
showList=
NO
;
//
默认不显示下拉框
oldFrame=frame;
//
未下拉时控件初始大小
//当下拉框显示时,计算出控件的大小。
newFrame=CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height*
5
);
lineColor=[UIColor lightGrayColor];
//
默认列表边框线为灰色
listBgColor=[UIColor whiteColor];
//
默认列表框背景色为白色
lineWidth=
1
;
//
默认列表边框粗细为
1
//把背景色设置为透明色,否则会有一个黑色的边
self
.backgroundColor=[UIColor clearColor];
[
self
drawView];
//
调用方法,绘制控件
}
returnself
;
}
-(
void
)drawView{
//文本框
textField=[[UITextField alloc]
initWithFrame:CGRectMake(
0
,
0
,
oldFrame.size.width,
oldFrame.size.height)];
textField.borderStyle=borderStyle;
//
设置文本框的边框风格
[
self
addSubview:textField];
[textField addTarget:
self
action:
@selector
(dropdown) forControlEvents:UIControlEventAllTouchEvents];
//下拉列表
listView=[[UITableView alloc]initWithFrame:
CGRectMake(lineWidth,oldFrame.size.height+lineWidth,
oldFrame.size.width-lineWidth*
2
,
oldFrame.size.height*
4
-lineWidth*
2
)];
listView.dataSource=
self
;
listView.delegate=
self
;
listView.backgroundColor=listBgColor;
listView.separatorColor=lineColor;
listView.hidden=!showList;
//一开始listView是隐藏的,此后根据showList的值显示或隐藏
[
self
addSubview:listView];
[listView release];
}
-(
void
)dropdown{
[textField resignFirstResponder];
if
(showList) {
//如果下拉框已显示,什么都不做
return
;
}
else
{
//如果下拉框尚未显示,则进行显示
//把dropdownList放到前面,防止下拉框被别的控件遮住
[
self
.superview bringSubviewToFront:
self
];
[
self
setShowList:
YES
];
//
显示下拉框
}
}
#pragma mark listViewdataSource method and delegate method
-(NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section{
return
list.count;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static
NSString *cellid=
@"listviewid"
;
UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:cellid];
if
(cell==
nil
){
cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:cellid]autorelease];
}
//文本标签
cell.textLabel.text=(NSString*)[list objectAtIndex:indexPath.row];
cell.textLabel.font=textField.font;
cell.selectionStyle=UITableViewCellSelectionStyleGray;
return
cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return
oldFrame.size.height;
}
//当选择下拉列表中的一行时,设置文本框中的值,隐藏下拉列表
-(
void
)tableView:(UITableView *)tableViewdidSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//NSLog(@"select");
textField.text=(NSString*)[list objectAtIndex:indexPath.row];
//NSLog(@"textField.text=%@",textField.text);
[
self
setShowList:
NO
];
}
-(
BOOL
)showList{
//setShowList:No为隐藏,setShowList:Yes为显示
return
showList;
}
-(
void
)setShowList:(
BOOL
)b{
showList=b;
NSLog(
@"showlist is set "
);
if
(showList){
self
.frame=newFrame;
}
else
{
self
.frame=oldFrame;
}
listView.hidden=!b;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code.
}
*/
- (
void
)dealloc {
[
super
dealloc];
}
@end
转载:http://www.cocoachina.com/bbs/read.php?tid=73570&page=5