iOS下拉列表

许照
2023-12-01

代码如下:
    
#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

 类似资料: