A number of posts are dealing with the subject: How to make an inline UIPickerView. As I am lazy, can anyone point me to a code snippet. To be honest, I find the Apple DateCell sample pedantic - there has to be an a more elegant method.
Is the dateCell app a good place to start? or are there other better links. I would appreciate any advice.
If you read this and do not understand my requirements / goal, please see the two posts referenced above or simply download the Apple Sample (dev. account required).
I use another - maybe simpler - solution to solve this.
Image that we have two cells
Most of the "magic" is within the table view delegate's tableView:heightForRowAtIndexPath: method:
- (CGFloat)tableView:(UITableView:)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat heightForRow = tableView.rowHeight;
if ([self isDatePickerRowAtIndexPath:indexPath]) {
heightForRow = (self.isDatePickerShown) ? heightOfDatePicker : 0.0;
}
return heightForRow;
}
So you simply "hide" the date picker by returning a height of 0.0.
In the tableView:didSelectRowAtIndexPath: method you do the toggling:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self isDateLabelRowAtIndexPath:indexPath])
{
self.datePickerIsShown = ! self.isDatePickerShown;
[tableView beginUpdates];
[tableView endUpdates];
}
}
Calling the empty beginUpdates endUpdates block forces the table to call the tableView:heightForRowAtIndexPath: again (animated) and nicely fades in or out the date picker cell.
When the date picker cell is the last one in a section you might also want to update the date label cell's separatorInset to UIEdgeInsetsZero when the date picker is hidden and to the default value when it's shown.
EDIT:
For completeness: datePickerIsShown is a simple boolean:
@property(nonatomic, getter = isDatePickerShown) BOOL datePickerIsShown;
The methods isDateLabelRowAtIndexPath: and isDatePickerRowAtIndexPath: are just helper methods that compare a given indexPath to the known index path of the appropriate cell:
- (BOOL)isDatePickerRowAtIndexPath:(NSIndexPath *)indexPath
{
return ([self.datePickerIndexPath compare:indexPath] == NSOrderedSame);
}
EDIT 2:
There's one additional step missing: Make sure that you set the date picker cell's clipsToBounds property to YES, otherwise you'll get some view glitches.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With