Как сделать модальный выбор даты, который охватывает только половину экрана?
Я хочу иметь тот же эффект, что и установщик даты рождения в приложении для контактов iPhone. Как сделать модальный выбор даты подойти только на полпути на экране.
Я хочу, чтобы выбор даты был над UITableView (например, в приложении для контактов iphone). Я хотел бы, чтобы UITableView свободно прокручивался позади выбора даты (например, в приложении контактов iphone).
Спасибо заранее.
Ответы
Ответ 1
На сегодняшний день лучшим способом добиться выбора с помощью клавиатуры ввода-вывода/uipicker является использование свойства входного представления текстового поля:
-
Создайте простой пользовательский UITableViewCell, содержащий UITextField (это важно только потому, что речь шла о вложении одного в табличное представление)
@interface pickerCell : UITableViewCell
{
UITextField *txtTextField;
UIPickerView* dtpPicker;
}
-
установите входное представление TextField как UIPickerView (убедитесь, что оба они были предварительно выделены и инициализированы):
txtTextField.inputView = dtpPicker;
-
Вы почти закончили. Теперь, когда текстовое поле становится первым ответчиком (пользователь постучал по нему), пользователю будет представлено представление выбора.
Просто заполните его своими собственными значениями. или используйте средство выбора даты.
-
Вы можете установить делегат/источник данных сборщика в одну и ту же ячейку (если она всегда будет ячейкой для родительской записи) или загрузить супервизор ячейки с данными. Какой бы выбор вы ни выбрали, обязательно обновите txtTextField.text на
pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
Удачи!
Elad.
Ответ 2
Этот код добавит выбор даты в качестве подзадачи UITableView. Этот код предполагает, что мы являемся подклассом UITableViewController.
Мы собираемся анимировать сборщик снизу. Наконец, мы подключаемся к методу scrollViewDidScroll: delegate, так что, когда таблица прокручивается, сборщик, похоже, остается на месте.
В вашем .h файле добавьте свойство для сборщика.
@property (strong, nonatomic) UIDatePicker *datePicker;
В вашем .m файле мы добавим сборщик дат.
- (void)viewDidLoad
{
// Your own customization code.
self.datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 200, 320, 216)];
self.datePicker.hidden = YES;
[self.datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:self.datePicker];
}
- (void)presentDatePicker
{
if (self.datePicker.hidden == NO) { return; }
// Set the date picker frame to be below the screen.
self.datePicker.frame = CGRectMake(0, self.view.frame.size.height, self.datePicker.size.width, self.datePicker.size.height);
CGRect originFrame = self.datePicker.frame;
// Animate from the bottom.
[UIAnimation animateWithDuration:.3 animations^{
self.datePicker.frame = CGRectMake(0, 200, originFrame.size.width, originFrame.size.height);
}];
}
#pragma mark - Scroll view delegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGRect tableBounds = self.tableView.bounds;
CGRect datePickerFrame = self.datePicker.frame;
self.datePicker.frame = CGRectMake(0, 200 + tableBounds.origin.y, datePickerFrame.size.width, datePickerFrame.size.height);
}
Не забудьте @synthesize ваше свойство и отпустите его на viewDidUnload
Ответ 3
В приложении для контактов iPhone приложение выбора даты появляется при нажатии кнопки. Для этого вам понадобится несколько вещей:
-
Кнопка, связанная с действием, позволяет вызвать действие
-(IBAction)showDatePicker:(id)sender
-
iVar, который является вашим datePicker, мы будем называть это datePicker
.
Теперь, в ViewDidLoad
, вам нужно создать datePicker и установить его фрейм. Поскольку мы не хотим, чтобы он отображался до нажатия кнопки showDatePicker, установите его рамку так, чтобы она была вне экрана. (0,416,320,216)
должен быть хорошим. Теперь добавьте datePicker в качестве подзаголовка вашего vc-представления. Помните, что он еще не должен появляться, потому что мы устанавливаем рамку на экран. Теперь, в вашем действии showDatePicker, мы хотим сделать datePicker, чтобы мы могли его оживить, изменив фрейм в анимации на основе блоков:
[UIView animateWithDuration:0.5 animations:^{
[datePicker setFrame:CGRectMake(0, 200, 320, 216)];
}];
Аналогично, вы можете сделать это, если хотите сделать кнопку, которая заставит datePicker исчезнуть. Вам просто нужно вернуть кадр к тому, что было изначально.
Я надеюсь, что это помогло!
-K
Ответ 4
Вот как я его реализовал: у меня есть UIDatePicker в другом контроллере DateTimeEntryViewController, и я выполняю следующий код в моем UIViewController, когда пользователь нажимает кнопку/ячейку, чтобы ввести дату и время:
self.alphaView = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.alphaView.opaque = NO;
self.alphaView.backgroundColor = [UIColor clearColor];
self.dateTimeEntryViewController.view.backgroundColor = [UIColor clearColor];
UIWindow *window = [[TTNavigator navigator] window];
[window addSubview:self.alphaView];
[window insertSubview:self.dateTimeEntryViewController.view aboveSubview:self.alphaView];
CGRect r = [_dateTimeEntryViewController.view frame];
r.origin.y = 480.0f;
[self.dateTimeEntryViewController.view setFrame:r];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.5f];
self.alphaView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5f];
r.origin.y = 0;
[self.dateTimeEntryViewController.view setFrame:r];
[UIView commitAnimations];
Поэтому я в основном показываю контроллер вида, у которого есть UIDatePicker поверх текущего.
Ответ 5
Проводка в старом потоке, но может помочь кому-то. Для 200-дюймового экрана достаточно использовать 200 для универсального подхода, используйте
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGRect tableBounds = self.tableView.bounds;
CGRect datePickerFrame = self.datePicker.frame;
self.datePicker.frame = CGRectMake(0,
tableBounds.origin.y + tableBounds.size.height - datePickerFrame.size.height,
datePickerFrame.size.width,
datePickerFrame.size.height);
}