代码改变世界

iphone 界面实现下拉列表

2011-08-19 09:16  Batys  阅读(3785)  评论(13编辑  收藏  举报

#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];//调用方法,绘制控件

}

return self;

}

-(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

附加效果图: