Skip to content

Instantly share code, notes, and snippets.

@miyakeryo
Last active December 18, 2015 01:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save miyakeryo/5704450 to your computer and use it in GitHub Desktop.
Save miyakeryo/5704450 to your computer and use it in GitHub Desktop.
DatePicker で日付時刻を入力できる TextField 作った http://miyakeryo.com/?p=457
//
// 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
//
// 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
// 使い方
#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
@sawat
Copy link

sawat commented Jun 6, 2013

ちょっと申し上げにくいですが (^^ ;
実はUIResponderの各サブクラスにはinputViewというプロパティがありまして、これにUIDatePickerを入れてあげるとテキストフィールドをタップしたときにキーボードの代わりにデイトピッカーが表示されるようにできます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment