Last active
December 18, 2015 01:29
-
-
Save miyakeryo/5704450 to your computer and use it in GitHub Desktop.
DatePicker で日付時刻を入力できる TextField 作った http://miyakeryo.com/?p=457
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// myoDatePickerField.h | |
// | |
// Created by Miyake Ryo on 13/05/15. | |
// Copyright (c) 2013年 Miyake Ryo. All rights reserved. | |
// | |
#import <UIKit/UIKit.h> | |
@protocol myoDatePickerFieldDelegate; | |
@interface myoDatePickerField : UITextField | |
@property (nonatomic,weak) id<myoDatePickerFieldDelegate> dpDelegate; | |
@property (nonatomic,strong) NSDateFormatter *dateFormatter; | |
@property (nonatomic) NSString *dateFormat; | |
@property (nonatomic) NSDate *date; | |
@property (nonatomic) NSLocale *locale; | |
@property (nonatomic) NSCalendar *calendar; | |
@property (nonatomic) NSTimeZone *timeZone; | |
@property (nonatomic) UIDatePickerMode datePickerMode; | |
@property (nonatomic) NSInteger minuteInterval; | |
@property (nonatomic) NSDate *minimumDate; | |
@property (nonatomic) NSDate *maximumDate; | |
- (void)setDate:(NSDate *)date animated:(BOOL)animated; | |
@end | |
@protocol myoDatePickerFieldDelegate<NSObject> | |
@optional | |
- (void)pickerField:(myoDatePickerField*)pickerField changeDate:(NSDate*)date; | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// myoDatePickerField.m | |
// | |
// Created by Miyake Ryo on 13/05/15. | |
// Copyright (c) 2013年 Miyake Ryo. All rights reserved. | |
// | |
#import "myoDatePickerField.h" | |
@interface myoDatePicker : UIDatePicker | |
- (void)toggle; | |
@end | |
@interface myoDatePickerField () | |
@property (nonatomic,strong) myoDatePicker *datePicker; | |
@end | |
#pragma mark - myoDatePickerField | |
@implementation myoDatePickerField | |
#pragma mark - life cycle | |
- (id)initWithFrame:(CGRect)frame | |
{ | |
self = [super initWithFrame:frame]; | |
if (self) { | |
self.borderStyle = UITextBorderStyleRoundedRect; | |
self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; | |
myoDatePicker *datePicker = [[myoDatePicker alloc] init]; | |
datePicker.datePickerMode = UIDatePickerModeDateAndTime; | |
datePicker.minuteInterval = 1; | |
datePicker.minimumDate = [NSDate date]; | |
datePicker.date = datePicker.minimumDate; | |
datePicker.hidden = YES; | |
datePicker.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin; | |
[datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged]; | |
self.datePicker = datePicker; | |
} | |
return self; | |
} | |
- (void)didMoveToSuperview | |
{ | |
[self dateChanged:self.datePicker]; | |
} | |
- (void)free | |
{ | |
[self.datePicker removeFromSuperview]; | |
self.datePicker = nil; | |
self.dateFormatter = nil; | |
} | |
- (void)dealloc | |
{ | |
[self free]; | |
} | |
#pragma mark - events | |
- (BOOL)canBecomeFirstResponder | |
{ | |
return YES; | |
} | |
- (BOOL)becomeFirstResponder | |
{ | |
if(!self.datePicker.hidden) | |
return YES; | |
UIWindow *window = [[UIApplication sharedApplication] keyWindow]; | |
CGRect rect = window.bounds; | |
rect.origin.y += rect.size.height; | |
self.datePicker.frame = rect; | |
[window addSubview:self.datePicker]; | |
[self.datePicker toggle]; | |
[self.datePicker becomeFirstResponder]; | |
return YES; | |
} | |
- (BOOL)resignFirstResponder | |
{ | |
[self.datePicker resignFirstResponder]; | |
return [super resignFirstResponder]; | |
} | |
- (void)dateChanged:(UIDatePicker*)datePicker | |
{ | |
if(self.dateFormatter){ | |
self.text = [self.dateFormatter stringFromDate:datePicker.date]; | |
}else{ | |
self.text = [NSDateFormatter localizedStringFromDate:datePicker.date | |
dateStyle:NSDateFormatterShortStyle | |
timeStyle:NSDateFormatterShortStyle]; | |
} | |
if([self.dpDelegate respondsToSelector:@selector(pickerField:changeDate:)]){ | |
[self.dpDelegate pickerField:self changeDate:datePicker.date]; | |
} | |
} | |
#pragma mark - setter methods | |
- (void)setDateFormat:(NSString*)dateFormat | |
{ | |
if(!self.dateFormatter) | |
self.dateFormatter = [[NSDateFormatter alloc] init]; | |
self.dateFormatter.dateFormat = dateFormat; | |
} | |
- (void)setDate:(NSDate*)date | |
{ | |
[self setDate:date animated:NO]; | |
} | |
- (void)setDate:(NSDate *)date animated:(BOOL)animated | |
{ | |
[self.datePicker setDate:date animated:animated]; | |
[self dateChanged:self.datePicker]; | |
} | |
- (void)setLocale:(NSLocale*)locale | |
{ | |
self.datePicker.locale = locale; | |
} | |
- (void)setCalender:(NSCalendar*)calendar | |
{ | |
self.datePicker.calendar = calendar; | |
} | |
- (void)setTimeZone:(NSTimeZone*)timeZone | |
{ | |
self.datePicker.timeZone = timeZone; | |
} | |
- (void)setDatePickerMode:(UIDatePickerMode)datePickerMode | |
{ | |
self.datePicker.datePickerMode = datePickerMode; | |
} | |
- (void)setMinuteInterval:(NSInteger)minuteInterval | |
{ | |
self.datePicker.minuteInterval = minuteInterval; | |
} | |
- (void)setMaximumDate:(NSDate*)maximumDate | |
{ | |
self.datePicker.maximumDate = maximumDate; | |
} | |
- (void)setMinimumDate:(NSDate*)minimumDate | |
{ | |
self.datePicker.minimumDate = minimumDate; | |
} | |
#pragma mark - getter methods | |
- (NSDate*)date | |
{ | |
return self.datePicker.date; | |
} | |
- (NSString*)dateFormat | |
{ | |
return self.dateFormatter.dateFormat; | |
} | |
- (NSLocale*)locale | |
{ | |
return self.datePicker.locale; | |
} | |
- (NSCalendar*)calendar | |
{ | |
return self.datePicker.calendar; | |
} | |
- (NSTimeZone*)timeZone | |
{ | |
return self.datePicker.timeZone; | |
} | |
- (UIDatePickerMode)datePickerMode | |
{ | |
return self.datePicker.datePickerMode; | |
} | |
- (NSInteger)minuteInterval | |
{ | |
return self.datePicker.minuteInterval; | |
} | |
- (NSDate*)maximumDate | |
{ | |
return self.datePicker.maximumDate; | |
} | |
- (NSDate*)minimumDate | |
{ | |
return self.datePicker.minimumDate; | |
} | |
@end | |
#pragma mark - myoDatePicker | |
@implementation myoDatePicker | |
- (BOOL)resignFirstResponder | |
{ | |
if(!self.hidden) | |
[self toggle]; | |
return [super resignFirstResponder]; | |
} | |
- (BOOL)canBecomeFirstResponder | |
{ | |
return YES; | |
} | |
- (void)toggle | |
{ | |
typeof(self) __weak _wself = self; | |
if(self.hidden){ | |
self.hidden = NO; | |
[UIView animateWithDuration:0.3 | |
delay:0.0 | |
options:UIViewAnimationOptionCurveEaseInOut | |
animations:^{ | |
CGRect rect = _wself.frame; | |
rect.origin.y -= rect.size.height; | |
_wself.frame = rect; | |
} | |
completion:NULL | |
]; | |
}else{ | |
[UIView animateWithDuration:0.2 | |
delay:0.0 | |
options:UIViewAnimationOptionCurveEaseInOut | |
animations:^{ | |
CGRect rect = _wself.frame; | |
rect.origin.y += rect.size.height; | |
_wself.frame = rect; | |
} | |
completion:^(BOOL finished){ | |
_wself.hidden = YES; | |
[_wself removeFromSuperview]; | |
} | |
]; | |
} | |
} | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 使い方 | |
#import "ViewController.h" | |
#import "myoDatePickerField.h" | |
@implementation ViewController | |
- (void)viewDidLoad | |
{ | |
[super viewDidLoad]; | |
myoDatePickerField *timeField; | |
timeField = [[myoDatePickerField alloc] initWithFrame:CGRectMake(80,100,160,30)]; | |
[timeField setDateFormat:@"yyyy/MM/dd HH:mm"]; | |
[self.view addSubview:timeField]; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ちょっと申し上げにくいですが (^^ ;
実はUIResponderの各サブクラスにはinputViewというプロパティがありまして、これにUIDatePickerを入れてあげるとテキストフィールドをタップしたときにキーボードの代わりにデイトピッカーが表示されるようにできます。