Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS Show UIDatePicker between UITableViewCells

In iOS 7, developers are encouraged to show date pickers between table cells when needed for input, and then hide them when done. How can I achieve this effect?

enter image description here

like image 611
danielmhanover Avatar asked Sep 29 '13 00:09

danielmhanover


People also ask

What is a uitableviewcell?

The visual representation of a single row in a table view. A UITableViewCell object is a specialized type of view that manages the content of a single table row. You use cells primarily to organize and present your app’s custom content, but UITableViewCell provides some specific customizations to support table-related behaviors, including:

What is uidatepicker in iOS 10?

Extension for rich Push Notification - iOS 10. UIDatePicker does not inherit from UIPickerView, but it manages a custom picker-view object as a subview. You can set the minimum and the maximum date that UIDatePicker can show. UIDatePicker has various picker modes.

Does uidatepicker inherit from uipickerview?

UIDatePicker does not inherit from UIPickerView, but it manages a custom picker-view object as a subview. You can set the minimum and the maximum date that UIDatePicker can show.

How do I change the style of uidatepicker?

Instead, UIDatePicker now has a property called datePickerStyle where you can let the system choose the best style with the .automatic style, or you can choose between .compact and .inline - both new to iOS 14 - or .wheel, which is the old style we have known for over a decade.


1 Answers

Vasilica Costescu has a great tutorial on it here: http://masteringios.com/blog/2013/10/31/ios-7-in-line-uidatepicker/

And for static tables: http://masteringios.com/blog/2013/11/18/ios-7-in-line-uidatepicker-part-2/

Sample code here: https://github.com/costescv/InlineDatePicker

The key bits are the hide/show methods:

 - (void)showDatePickerCell {
    self.datePickerIsShowing = YES;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];

    self.datePicker.hidden = NO;
    self.datePicker.alpha = 0.0f;

    [UIView animateWithDuration:0.25 animations:^{
        self.datePicker.alpha = 1.0f;
    }];
}

- (void)hideDatePickerCell {
    self.datePickerIsShowing = NO;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];

    [UIView animateWithDuration:0.25
                     animations:^{
                         self.datePicker.alpha = 0.0f;
                     }
                     completion:^(BOOL finished){
                         self.datePicker.hidden = YES;
                     }];
}

And this UITableViewDelegate method will "hide" the row by setting its height to 0 :

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.section == 0 && indexPath.row == 4 && self.datePickerIsShowing == NO){
        // hide date picker row
        return 0.0f;
    }
    return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}

You can call the hide/show methods from a button or just by selecting rows in the table. (Note: If there are text fields the other rows, then you may need to hide the datePicker in the textFieldDidBeginEditing delegate method).

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0 && indexPath.row == 4) {
        if (self.datePickerIsShowing){
            [self hideDatePickerCell];
        }else {
            [self showDatePickerCell];
        }
    }
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

EDIT: Be careful using more than a couple of these inline picker views on in a single table. I've noticed that they tend to load very slowly from storyboards: iOS 7 slow to open UITableViewController with UIPickerView

like image 102
Anthony F Avatar answered Oct 06 '22 01:10

Anthony F