Как сделать модальный выбор даты, который охватывает только половину экрана?

Я хочу иметь тот же эффект, что и установщик даты рождения в приложении для контактов 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);
}