IPhone: Add Finish Button to DatePicker Popup

I infer DatePicker with the following. Now I'm trying to add a β€œFinish” button at the top of the pop-up frame.

-(IBAction) contactBDayDatePicker{ NSLog(@"contactBDayDatePicker"); pickerView = [[UIDatePicker alloc] init]; pickerView.datePickerMode = UIDatePickerModeDate; if (self.pickerView.superview == nil){ [self.view.window addSubview: self.pickerView]; // size up the picker view to our screen and compute the start/end frame origin for our slide up animation // // compute the start frame CGRect screenRect = [[UIScreen mainScreen] applicationFrame]; NSLog(@"screenRect %@",NSStringFromCGRect(screenRect)); CGSize pickerSize = [self.pickerView sizeThatFits:CGSizeZero]; NSLog(@"pickerSize %@",NSStringFromCGSize(pickerSize)); CGRect startRect = CGRectMake(0.0, screenRect.origin.y + screenRect.size.height, pickerSize.width, pickerSize.height); self.pickerView.frame = startRect; NSLog(@"pickerView.frame %@",NSStringFromCGRect(startRect)); // compute the end frame CGRect pickerRect = CGRectMake(0.0, screenRect.origin.y + screenRect.size.height - pickerSize.height, pickerSize.width, pickerSize.height+10); NSLog(@"pickerRect %@",NSStringFromCGRect(pickerRect)); // start the slide up animation [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.3]; // we need to perform some post operations after the animation is complete [UIView setAnimationDelegate:self]; self.pickerView.frame = pickerRect; [UIView commitAnimations]; } } 

I tried to increase the frame size by 10 points (see CGSize pickerSize above) and thought that I could use something like the following, but the button refuses to display, plus I'm not sure how to put the button inside the pickerSize frame. (BTW) DatePicker and Button overlay scrollView, if that matters.

  UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button setTitle:@"Done" forState:UIControlStateNormal]; button.center = CGPointMake(160,240); [button addTarget:self action:@selector(done) forControlEvents:(UIControlEventTouchUpInside)]; [self.view addSubview:button]; 

Any thoughts are appreciated.

+4
source share
5 answers

I did basically the same thing. I have subclassed UIView. He revives everything. Here is some code:

 #import <UIKit/UIKit.h> #define MyDateTimePickerHeight 260 @interface MyDateTimePicker : UIView { } @property (nonatomic, assign, readonly) UIDatePicker *picker; - (void) setMode: (UIDatePickerMode) mode; - (void) setHidden: (BOOL) hidden animated: (BOOL) animated; - (void) addTargetForDoneButton: (id) target action: (SEL) action; @end #define MyDateTimePickerPickerHeight 216 #define MyDateTimePickerToolbarHeight 44 @interface MyDateTimePicker() @property (nonatomic, assign, readwrite) UIDatePicker *picker; @property (nonatomic, assign) CGRect originalFrame; @property (nonatomic, assign) id doneTarget; @property (nonatomic, assign) SEL doneSelector; - (void) donePressed; @end @implementation MyDateTimePicker @synthesize picker = _picker; @synthesize originalFrame = _originalFrame; @synthesize doneTarget = _doneTarget; @synthesize doneSelector = _doneSelector; - (id) initWithFrame: (CGRect) frame { if ((self = [super initWithFrame: frame])) { self.originalFrame = frame; self.backgroundColor = [UIColor clearColor]; CGFloat width = self.bounds.size.width; UIDatePicker *picker = [[[UIDatePicker alloc] initWithFrame: CGRectMake(0, 0, width, MyDateTimePickerPickerHeight)] autorelease]; [self addSubview: picker]; UIToolbar *toolbar = [[[UIToolbar alloc] initWithFrame: CGRectMake(0, MyDateTimePickerPickerHeight, width, MyDateTimePickerToolbarHeight)] autorelease]; toolbar.barStyle = UIBarStyleBlackOpaque; UIBarButtonItem *doneButton = [[[UIBarButtonItem alloc] initWithTitle: @"Done" style: UIBarButtonItemStyleBordered target: self action: @selector(donePressed)] autorelease]; doneButton.width = width - 20; toolbar.items = [NSArray arrayWithObject: doneButton]; [self addSubview: toolbar]; self.picker = picker; } return self; } - (void)dealloc { [super dealloc]; } - (void) setMode: (UIDatePickerMode) mode { self.picker.datePickerMode = mode; } - (void) donePressed { if (self.doneTarget) { [self.doneTarget performSelector: self.doneSelector]; } } - (void) addTargetForDoneButton: (id) target action: (SEL) action { self.doneTarget = target; self.doneSelector = action; } - (void) setHidden: (BOOL) hidden animated: (BOOL) animated { CGRect newFrame = self.originalFrame; newFrame.origin.y += hidden ? MyDateTimePickerHeight : 0; if (animated) { [UIView beginAnimations: @"animateDateTimePicker" context: nil]; [UIView setAnimationDuration: MyConstantsElementAnimationLength]; [UIView setAnimationCurve: UIViewAnimationCurveEaseOut]; self.frame = newFrame; [UIView commitAnimations]; } else { self.frame = newFrame; } } @end 
+13
source

I am setting up the Micah class to support multiple orientation and ARC

DateTimePicker.h

  @interface DateTimePicker : UIView { } @property (nonatomic, assign, readonly) UIDatePicker *picker; - (void) setMode: (UIDatePickerMode) mode; - (void) addTargetForDoneButton: (id) target action: (SEL) action; @end 

DateTimePicker.m

 #define MyDateTimePickerToolbarHeight 40 @interface DateTimePicker() @property (nonatomic, assign, readwrite) UIDatePicker *picker; @property (nonatomic, assign) id doneTarget; @property (nonatomic, assign) SEL doneSelector; - (void) donePressed; @end @implementation DateTimePicker @synthesize picker = _picker; @synthesize doneTarget = _doneTarget; @synthesize doneSelector = _doneSelector; - (id) initWithFrame: (CGRect) frame { if ((self = [super initWithFrame: frame])) { self.backgroundColor = [UIColor clearColor]; UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame: CGRectMake(0, MyDateTimePickerToolbarHeight, frame.size.width, frame.size.height - MyDateTimePickerToolbarHeight)]; [self addSubview: picker]; UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame: CGRectMake(0, 0, frame.size.width, MyDateTimePickerToolbarHeight)]; toolbar.barStyle = UIBarStyleBlackOpaque; toolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth; UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle: @"Done" style: UIBarButtonItemStyleBordered target: self action: @selector(donePressed)]; UIBarButtonItem* flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; toolbar.items = [NSArray arrayWithObjects:flexibleSpace, doneButton, nil]; [self addSubview: toolbar]; self.picker = picker; picker.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin; self.autoresizesSubviews = YES; self.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin; } return self; } - (void) setMode: (UIDatePickerMode) mode { self.picker.datePickerMode = mode; } - (void) donePressed { if (self.doneTarget) { [self.doneTarget performSelector:self.doneSelector withObject:nil afterDelay:0]; } } - (void) addTargetForDoneButton: (id) target action: (SEL) action { self.doneTarget = target; self.doneSelector = action; } 

Using a custom view in a view controller:

 NSDate *selectedDate; UIButton *button; - (void)viewDidLoad { [super viewDidLoad]; selectedDate = [NSDate new]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"MM/dd/yyyy"; button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown]; [button setTitle:[dateFormatter stringFromDate:selectedDate] forState:UIControlStateNormal]; button.frame = CGRectMake(100, 50, 100, 40.0); [self.view addSubview:button]; CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenWidth = screenRect.size.width; CGFloat screenHeight = screenRect.size.height; picker = [[DateTimePicker alloc] initWithFrame:CGRectMake(0, screenHeight/2 - 35, screenWidth, screenHeight/2 + 35)]; [picker addTargetForDoneButton:self action:@selector(donePressed)]; [self.view addSubview:picker]; picker.hidden = YES; [picker setMode:UIDatePickerModeDate]; [picker addTarget:self action:@selector(pickerChanged) forControlEvents:UIControlEventValueChanged]; } -(void)pickerChanged { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"MM/dd/yyyy"; selectedDate = picker.date; [button setTitle:[dateFormatter stringFromDate:selectedDate] forState:UIControlStateNormal]; } -(void)donePressed { picker.hidden = YES; } -(void)buttonPressed:(id)sender { picker.hidden = NO; [picker setDate:selectedDate]; } 
+5
source

Sample code using UIToolbar as an accessory:

Define the instance variables keyboardToolbar and datePicker.

 if (keyboardToolbar == nil) { keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)]; [keyboardToolbar setBarStyle:UIBarStyleBlackTranslucent]; UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(changeDate:)]; [keyboardToolbar setItems:[[NSArray alloc] initWithObjects: flexSpace, done, nil]]; } self.userBirthdayTextField.inputAccessoryView = keyboardToolbar; if(datePicker == nil) { datePicker = [[UIDatePicker alloc] init]; datePicker.datePickerMode = UIDatePickerModeDate; } self.userBirthdayTextField.inputView = datePicker; 
+4
source

Based on the above code, I created a repository on the Git Hub: https://github.com/lenhhoxung86/CustomDatePicker

+4
source

How to make a new UIView and put a datepicker button in it and do it?

+2
source

All Articles