<!--StartFragment-->
cocoa提供了UIDatePicker控件,但是對于程序員而言并不友好。其糟糕之處,莫過于無法指定其frame,它的大小固定為320*216(占據了近整個iphone屏幕的一半),導致在UI設計時很難安排下這個“巨大”的東西。
我們自定義的日期挑選控件是這樣的。
它默認情況下顯示為一個 textfield,以文本的方式顯示日期,當你試圖編輯它時,會彈出一個足夠巨大的UIDatePicker控件:
<!--StartFragment-->
轉動日期時,其實 textfield中的值會作相應改變。選擇好日期后,點擊左上角的關閉按鈕關閉這個UIDatePicker。
這個控件的使用非常簡單。
通常只需要通過下面的代碼構造它并 addSubview就可以了:
DatePicker * dp=[[ DatePicker alloc ] initWithFrame : CGRectMake ( 10 , 25 , 220 , 35 )];
[ self . view addSubview :dp];
如果想改變 DatePicker的樣式,比如顯示時間而不是日期,可以修改其datePickerMode和dateFormatter屬性:
dp. datePickerMode = UIDatePickerModeTime ;
NSDateFormatter * df=[[ NSDateFormatter alloc ] init ];
[df setDateFormat : @"HH:mm:ss" ];
dp. dateFormatter =df;
如果要獲取控件的日期時間值和字符串值,則可以使用控件的 date屬性和textField.text屬性。
全部的源代碼在這里:
============ DatePicker.h===========
@interface DatePicker : UIView
<UITextFieldDelegate>{
UITextField * textField ; // 文本框
UIDatePicker * datePicker ; // 日期選擇控件
NSDateFormatter * dateFormatter ; // 日期格式
UIDatePickerMode datePickerMode ; // 日期控件顯示風格
NSDate * date ;
UIView * subview ;
}
@property ( nonatomic ) UIDatePickerMode datePickerMode;
//@property(nonatomic,retain)UITextField* textField;
@property ( nonatomic , retain )NSDateFormatter* dateFormatter;
@property ( nonatomic , retain )NSDate* date;
//@property(nonatomic,retain)UIDatePicker* datePicker;
-( UIDatePickerMode )datePickerMode;
-( void )setDatePickerMode:( UIDatePickerMode )mode;
-( NSDateFormatter *)dateFormatter;
-( void )setDateFormatter:( NSDateFormatter *)df;
-( NSDate *)date;
-( void )setDate:( NSDate *)d;
-( UITextField *)textField;
-( UIDatePicker *)datePicker;
@end
============== DatePicker.m==============
#import "DatePicker.h"
@implementation DatePicker
-( UIDatePicker *)datePicker
{
return datePicker ;
}
-( UITextField *)textField
{
return textField ;
}
-( NSDate *)date
{
return date ;
}
-( void )setDate:( NSDate *)d
{
date =d;
datePicker . date = date ;
}
-( NSDateFormatter *)dateFormatter
{
return dateFormatter ;
}
-( void )setDateFormatter:( NSDateFormatter *)df{
dateFormatter =df;
textField . text =[ dateFormatter stringFromDate : date ];
}
-( UIDatePickerMode )datePickerMode
{
return datePickerMode ;
}
-( void )setDatePickerMode:( UIDatePickerMode )mode{
datePickerMode =mode;
datePicker . datePickerMode = datePickerMode ;
}
- ( id )initWithFrame:( CGRect ) frame {
if (( self = [ super initWithFrame : frame ])) {
// 默認日期格式為 yyyy-MM-dd
dateFormatter = [[ NSDateFormatter alloc ] init ];
[ dateFormatter setLocale :[[ NSLocale alloc ] initWithLocaleIdentifier : @"zh_CN" ]]; //location 設置為中國
[ dateFormatter setDateFormat : @"yyyy-MM-dd" ];
//picker 的默認時間為當前時間
date =[ NSDate date ];
//picker 的默認 style 為只顯示日期
datePickerMode = UIDatePickerModeDate ;
// 構造一個子視圖 , 用于顯示日期選擇器
subview =[[ UIView alloc ] initWithFrame : CGRectMake ( 0 , 0 , 320 , 480 )];
subview . backgroundColor =[ UIColor clearColor ];
subview . tag = 0 ;
// 為子視圖構造工具欄按鈕
UIBarButtonItem * item = [[[ UIBarButtonItem alloc ]
initWithBarButtonSystemItem : UIBarButtonSystemItemStop
target : self action : @selector ( btnCloseClick )] autorelease ];
NSArray * buttons=[ NSArray arrayWithObjects :item, nil ];
// 為子視圖構造工具欄
UIToolbar *subToolbar=[[ UIToolbar alloc ] initWithFrame : CGRectMake ( 0 , 0 , 320 , 44 )];
subToolbar. barStyle = UIBarStyleBlackTranslucent ;
[subToolbar sizeToFit ];
[subToolbar setItems :buttons animated : YES ]; // 把按鈕加入工具欄
[ subview addSubview :subToolbar]; // 把工具欄加入子視圖
[subToolbar release ];
// 為子視圖構造 datePicker
datePicker =[[ UIDatePicker alloc ] init ];
[ datePicker setDate : date ];
datePicker . frame = CGRectMake ( 0 , 44 , 320 , 216 );
datePicker . datePickerMode = datePickerMode ;
// 指定 datepicker 的 valueChanged 事件
[ datePicker addTarget : self action : @selector ( dateChanged :) forControlEvents : UIControlEventValueChanged ];
[ subview addSubview : datePicker ]; // 把 datePicker 加入子視圖
// 上面是子視圖,下面是父視圖
// 文本框
textField =[[ UITextField alloc ] initWithFrame : frame ];
textField . delegate = self ;
// textField.enabled=NO;
textField . borderStyle = UITextBorderStyleRoundedRect ;
textField . text =[ dateFormatter stringFromDate : date ];
[ self addSubview : textField ];
}
return self ;
}
// 當 datepicker 的值改變時觸發
-( void )dateChanged:( id )sender{
date = [sender date ]; // 獲取 datepicker 的日期
// 改變 textField的值
textField . text =[ NSString stringWithString :
[ dateFormatter stringFromDate : date ]];
}
// 關閉按鈕點擊時觸發
-( void )btnCloseClick{
if ( subview != nil ){
subview . tag = 0 ;
[ subview removeFromSuperview ];
}
}
- ( void )dealloc {
[ textField release ];
[ date release ];
[ dateFormatter release ];
[ datePicker release ];
[ subview release ];
[ super dealloc ];
}
#pragma mark textField delegate method
// 當 textField 被點擊時觸發
-( BOOL )textFieldShouldBeginEditing:( UITextField *) textField {
if ( subview . tag == 0 ) { // 若 tag 標志等于 0 ,說明 datepicker 未顯示
// 置 tag 標志為 1 ,并顯示子視圖
subview . tag = 1 ;
[ self . superview addSubview : subview ];
}
return NO ;
}
@end
<!--EndFragment--><!--EndFragment-->
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
