How to add Date picker in Action Sheet?

Gaurav Govilkar picture Gaurav Govilkar · Dec 2, 2011 · Viewed 10k times · Source
- (IBAction) showCatPicker {

    if (self.catList !=nil) {
        self.catList=nil;
        [catList release];
    }
    self.catList =  [[NSMutableArray alloc] init];

        self.actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];   
    [self.actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];

    CGRect pickerFrame = CGRectMake(0, 40, 0, 0);   
    if(self.catPicker == nil) {     
        self.catPicker = [[UIPickerView alloc] initWithFrame:pickerFrame];

        self.catPicker.showsSelectionIndicator = YES;
        self.catPicker.dataSource = self;
        self.catPicker.opaque = YES;
        self.catPicker.multipleTouchEnabled = YES;
        self.catPicker.userInteractionEnabled = YES;
        self.catPicker.delegate = self;     
    }

    [self.actionSheet addSubview:self.catPicker];

    UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Select"]];
    closeButton.momentary = YES; 
    closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
    closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
    closeButton.tintColor = [UIColor colorWithRed:19.0/255 green:122.0/255 blue:53.0/255 alpha:1.0];
    [closeButton addTarget:self action:@selector(dismissGenderPicker:) forControlEvents:UIControlEventValueChanged];

    UISegmentedControl *cancelButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Cancel"]];
    cancelButton.momentary = YES; 
    cancelButton.frame = CGRectMake(10, 7.0f, 50.0f, 30.0f);
    cancelButton.segmentedControlStyle = UISegmentedControlStyleBar;
    cancelButton.tintColor = [UIColor colorWithRed:19.0/255 green:122.0/255 blue:53.0/255 alpha:1.0];
    [cancelButton addTarget:self action:@selector(cancelActionSheet) forControlEvents:UIControlEventValueChanged];

    [self.actionSheet addSubview:cancelButton]; 
    [self.actionSheet addSubview:closeButton];

    [cancelButton release]; 
    [closeButton release];  
    [self.actionSheet showInView:self.view];    
    [self.actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
    [catPicker reloadComponent:0];
}

Answer

Razvan picture Razvan · Sep 23, 2014

You should definitely NOT use UIActionSheet to hold an UIDatePicker because this functionality is deprecated!

From the Documentation:

Subclassing Notes

UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy. If you need to present a sheet with more customization than provided by the UIActionSheet API, you can create your own and present it modally with presentViewController:animated:completion:.

and

Important: UIActionSheet is deprecated in iOS 8. (Note that UIActionSheetDelegate is also deprecated.) To create and manage action sheets in iOS 8 and later, instead use UIAlertController with a preferredStyle of UIAlertControllerStyleActionSheet.

What you could very easily do is to create an UIView to hold the UIDatePicker and animate the view as appropriate. You can even add an UIToolbar to it if you need to.

Here's an example:

Create two properties:

@property (strong, nonatomic) UIDatePicker *theDatePicker;
@property (strong, nonatomic) UIView *pickerView;

Create your picker, embed it into the UIView and show:

    -(void) createDatePickerAndShow {

        UIToolbar *controlToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, pickerView.bounds.size.width, 44)];

        [controlToolbar sizeToFit];

        UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

        UIBarButtonItem *setButton = [[UIBarButtonItem alloc] initWithTitle:@"Set" style:UIBarButtonItemStyleDone target:self action:@selector(dismissDateSet)];

        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelDateSet)];

        [controlToolbar setItems:[NSArray arrayWithObjects:spacer, cancelButton, setButton, nil] animated:NO];


        [theDatePicker setFrame:CGRectMake(0, controlToolbar.frame.size.height - 15, theDatePicker.frame.size.width, theDatePicker.frame.size.height)];

        if (!pickerView) {
            pickerView = [[UIView alloc] initWithFrame:theDatePicker.frame];
        } else {
            [pickerView setHidden:NO];
        }


        CGFloat pickerViewYpositionHidden = self.view.frame.size.height + pickerView.frame.size.height;

        CGFloat pickerViewYposition = self.view.frame.size.height - pickerView.frame.size.height;

        [pickerView setFrame:CGRectMake(pickerView.frame.origin.x,
                                        pickerViewYpositionHidden,
                                        pickerView.frame.size.width,
                                        pickerView.frame.size.height)];
        [pickerView setBackgroundColor:[UIColor whiteColor]];
        [pickerView addSubview:controlToolbar];
        [pickerView addSubview:theDatePicker];
        [theDatePicker setHidden:NO];


        [self.view addSubview:pickerView];

        [UIView animateWithDuration:0.5f
                         animations:^{
                             [pickerView setFrame:CGRectMake(pickerView.frame.origin.x,
                                                             pickerViewYposition,
                                                             pickerView.frame.size.width,
                                                             pickerView.frame.size.height)];
                         }
                         completion:nil];

    }

And to dismiss the DatePicker:

    -(void) cancelDateSet {    
    CGFloat pickerViewYpositionHidden = self.view.frame.size.height + pickerView.frame.size.height;    

        [UIView animateWithDuration:0.5f
                         animations:^{
                             [pickerView setFrame:CGRectMake(pickerView.frame.origin.x,
                                                             pickerViewYpositionHidden,
                                                             pickerView.frame.size.width,
                                                             pickerView.frame.size.height)];
                         }
                         completion:nil];
    }