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

Я хочу иметь тот же эффект, что и у установщика даты рождения в приложении контактов iPhone. Как мне модальный сборщик дат подняться на полпути на экране.

Я хочу, чтобы указатель даты находился поверх UITableView (как в приложении контактов iphone). Я хотел бы, чтобы UITableView свободно прокручивался за средством выбора даты (как в приложении контактов iphone).

Заранее спасибо.

5 ответов

Решение

Безусловно, лучший способ добиться подобного клавиатуре средства выбора даты /uipicker - это использовать свойство представления ввода текстового поля:

  1. Создайте простой пользовательский UITableViewCell, который содержит UITextField (это важно только потому, что вопрос был о внедрении одного в табличное представление)

    @interface pickerCell : UITableViewCell
    {
        UITextField *txtTextField;
        UIPickerView* dtpPicker;
    }
    
  2. установите входное представление TextField как UIPickerView (убедитесь, что они были одновременно выделены и инициализированы):

    txtTextField.inputView = dtpPicker;
    
  3. Вы почти закончили. Теперь, когда текстовое поле становится первым респондентом (пользователь нажал на него), пользователю будет предложено представление выбора. Просто заполните его своими собственными ценностями. или используйте сборщик дат.

  4. Вы можете установить делегат / источник данных сборщика в одну и ту же ячейку (если она всегда будет ячейкой даты рождения) или сделать так, чтобы супервизор ячейки загружал ее данными. Какой бы выбор вы не сделали, обязательно обновите txtTextField.text на

    pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    

Удачи! Elad.

Этот код добавит средство выбора даты в качестве подпредставления UITableView. Этот код предполагает, что мы являемся подклассом UITableViewController.

Мы собираемся оживить сборщик снизу. Наконец, мы подключаем метод scrollViewDidScroll: делегат, чтобы при прокрутке таблицы средство выбора оставалось на месте.

В своем файле.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

Вот как я это реализовал: у меня 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 поверх текущего.

Размещение в старой теме, но может помочь кому-то. Добавление 200 достаточно для 3,5"экрана, для универсального подхода используйте

- (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);
}

В приложении контактов iPhone устройство выбора даты появляется при нажатии кнопки. Для этого вам понадобится пара вещей:

  1. Кнопка, связанная с действием, давайте назовем действие
    -(IBAction)showDatePicker:(id)sender

  2. 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 исчезнет. Вам просто нужно установить рамку обратно на то, что было изначально.

Я надеюсь, что это помогло!

Другие вопросы по тегам