问题
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).
回答1:
I use another - maybe simpler - solution to solve this.
Image that we have two cells
- Date label cell
- Date picker cell
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.
来源:https://stackoverflow.com/questions/20566304/ios7-uitableviewcell-with-uipickerview-and-uidatepicker-built-inline