Как сделать модальное средство выбора даты, которое покрывает только половину экрана? - PullRequest
15 голосов
/ 13 декабря 2011

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

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

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

Ответы [ 5 ]

49 голосов
/ 21 декабря 2011

На сегодняшний день лучший способ добиться подобного клавиатуре выбора даты / 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.

2 голосов
/ 23 декабря 2011

Этот код добавит средство выбора даты в качестве подпредставления 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

1 голос
/ 15 февраля 2013

Публикация в старой теме, но может кому-то помочь.Для экрана 3.5 "достаточно добавить 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);
}
1 голос
/ 22 декабря 2011

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

1 голос
/ 13 декабря 2011

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

Надеюсь, это помогло!

-K

...