Я искал повсюду чистый способ скрывать и показывать (переключать) UIPickerView, используя один элемент кнопки и только найденные фрагменты. Для тех, кто хочет сделать то же самое, вот мой рабочий результат с помощью основного условного утверждения.
ViewController.m
- (IBAction)animatePicker {
if ([self.userSelection.title isEqualToString: (NSString *)@"Select"]) {
_userPicker.hidden = NO;
UIPickerView *pickerView = [[UIPickerView alloc] init]; // default frame is set
float pvHeight = pickerView.frame.size.height;
float y = [[UIScreen mainScreen] bounds].size.height - (pvHeight); // the root view of view controller
[UIView animateWithDuration:0.25f delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
self.userPicker.frame = CGRectMake(0 , y, pickerView.frame.size.width, pvHeight);
} completion:nil];
} else if ([self.userSelection.title isEqualToString: (NSString *)@"Done"]) {
UIPickerView *pickerView = [[UIPickerView alloc] init]; // default frame is set
float pvHeight = pickerView.frame.size.height;
float y = [[UIScreen mainScreen] bounds].size.height - (pvHeight * -2); // the root view of view controller
[UIView animateWithDuration:0.25f delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
self.userPicker.frame = CGRectMake(0 , y, pickerView.frame.size.width, pvHeight);
} completion:nil];
self.userSelection.title = @"Select";
}
}
Итак, вот что здесь происходит: у меня есть элемент кнопки с именем «userSelection» с заголовком «Select» и скрытый UIPickerView с именем «userPicker» (чтобы скрыть, просто скопируйте бит о «_userPicker.hidden» , вставьте его в декларацию выбора и установите логическое значение YES). Элемент кнопки связан с вышеуказанным действием. При загрузке (т. Е. Когда заголовок кнопки говорит «Выбрать»), он отображает средство выбора и отображает его. Вы можете использовать опции animateWithDuration и delay для управления этой функцией, но эти настройки кажутся мне вполне естественными.
Тогда у меня есть этот метод, меняющий заголовок кнопки на «Готово», когда что-то было выбрано. Я уверен, что есть более чистый способ сделать это, но метод switch дает мне некоторую свободу в случае, если я захочу внести изменения в пользовательский интерфейс позже.
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
NSLog(@"Selected Row %ld", (long)row);
switch(row)
{
case 0:
self.userSelection.title = @"Done";
break;
case 1:
self.userSelection.title = @"Done";
break;
case 2:
self.userSelection.title = @"Done";
break;
case 3:
self.userSelection.title = @"Done";
break;
case 4:
self.userSelection.title = @"Done";
break;
case 5:
self.userSelection.title = @"Done";
break;
}
}
Наконец, действие закрывается с помощью «else if», которое говорит, когда кнопка говорит «Done», скрывает средство выбора с обратной анимацией (тот же код, но с «pvHeight * -2») и затем устанавливает заголовок кнопки вернуться к «Выбрать», который служит для завершения цикла всего действия.
Вероятно, более легкий путь для профессионалов, но для людей, которые являются новичками в этом, как я, это имело наиболее логичный смысл. Плюс это работает, так что это всегда бонус!