Скрытие / отображение UIPickerView - PullRequest
19 голосов
/ 14 апреля 2010

У меня есть событие touchesEnded, которое проверяет, когда нажат UITextField. То, что я хотел бы сделать, это скрыть / показать UIPickerView. Как это можно сделать?

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [[event allTouches] anyObject];
    if (CGRectContainsPoint([self.textField frame], [touch locationInView:self.view]))
    {
        NSString * error = @"Touched the TextField";
        UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Selection!" message:error delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [errorAlert show];
        //Want to show or hide UIPickerView
    }
}

У меня уже есть выделенный UIPickerView, когда происходят касания

@interface ThirdViewController : UIViewController <UITextFieldDelegate,UIPickerViewDelegate> {
    IBOutlet UIPickerView *pickerView;
}

Ответы [ 9 ]

35 голосов
/ 10 ноября 2011

Переключение «скрытого» свойства сделает свое дело, но также даст очень резкое раскрытие.

Один из способов избежать этого - заставить сборщик скользить вверх от нижней части экрана, встраивая его в UIActionSheet.

Вот пример:

    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil 
delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

    CGRect pickerFrame = CGRectMake(0, 0, 0, 0);
    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;
    [sheet addSubview:pickerView];
    [pickerView release];

    [sheet showInView:view];
    [sheet setBounds:CGRectMake(0, 0, 320, 415)];
    self.actionSheet = sheet; // assuming you have setup a property to hold the action sheet
    [sheet release];

Когда вы закончите со сборщиком, отклоните его:

[self.actionSheet dismissWithClickedButtonIndex:0 animated:YES];

Этот подход также можно использовать для включения кнопок на панели над средством выбора («Готово», «Предыдущий», «Далее» и т. Д.) - здесь есть хорошее объяснение, как это сделать здесь .

23 голосов
/ 23 ноября 2013

Поскольку я видел комментарий о том, что эти решения не работают на iOS 7, я буду считать, что эта тема все еще актуальна и находится в поиске.

Лучший способ сделать это - подключить UIPickerView к (скрытому) UITextField в качестве представления ввода, например:

_myPicker = [[UIPickerView alloc] init];
_myPicker.delegate = self;
_myPicker.showsSelectionIndicator = YES;
myTextField.inputView = _myPicker;

При желании вы всегда можете скрыть текстовое поле. Затем вы можете показать / скрыть UIPickerView, активировав текстовое поле в качестве первого респондента, например:

[myTextField becomeFirstResponder];
[myTextField resignFirstResponder];

Я проверил, что это работает на iOS 7, и у меня это работало еще в iOS 5.

14 голосов
/ 14 апреля 2010

UIPickerView наследует от UIView, поэтому вы можете просто переключить его «скрытое» свойство:

if (pickerView) pickerView.hidden = !pickerView.hidden;
5 голосов
/ 24 ноября 2015

Я использую манекен UITextField для показа / скрытия UIPickerView

Сначала добавьте UITextField как @property на UIViewController. При желании можно добавить UIPickerView, а также

@property (strong, nonatomic) UITextField *dummyTextField;

Во-вторых, присвойте UIPickerView как inputView для UITextField. Назначьте себя как dataSource и delegate для UIPickerView. UITextField необходимо добавить в качестве подпредставления на view. *1019*.

- (void)viewDidLoad {

    [super viewDidLoad];

    UIPickerView *picker = [[UIPickerView alloc] init];
    [picker setDataSource:self];
    [picker setDelegate:self];

    self.dummyTextField = [UITextField new];
    self.dummyTextField.inputView = picker;
    [self.dummyTextField setHidden:YES];
    [self.view addSubview:self.dummyTextField];
}

Наконец, добавьте механизм для отображения и скрытия UIPickerView. Поскольку я использую манекен UITextField, я решил добавить UIBarButtonItem с именем "Filter" со следующим IBAction:

- (IBAction)tappedFilterButton:(UIBarButtonItem *)sender {

    if (self.dummyTextField.isFirstResponder) {

        [self.dummyTextField resignFirstResponder];
    }
    else {

        [self.dummyTextField becomeFirstResponder];
    }
}
3 голосов
/ 24 декабря 2014

Вы можете использовать ActionSheetPicker-3.0

Похоже, что UIPickerView внутри UIActionSheet, а также для iOS 6-7-8.

animation

enter image description here

2 голосов
/ 06 июля 2012

Так что я использовал много ссылок, чтобы попытаться выяснить это, и тогда моя лучшая ссылка (верьте, хотите нет) была из яблочных документов по ссылке на класс UIView.

Я построил мини-представление ("_pickerView" поверх моего основного вида, в котором были UIToolBar, UIToolButton (с IBAction "closePicker") и UIPicker.

*** обратите внимание, что это работает только для iOS 4.0 и выше

код для закрытия и отображения UIView ("_pickerView"):

-(IBAction)closePicker:(id)sender
{
    [UIView animateWithDuration:0.3 animations:^{ 
        _pickerView.frame = CGRectMake(_pickerView.frame.origin.x,
                                       460, //Displays the view off the screen
                                       _pickerView.frame.size.width,
                                       _pickerView.frame.size.height);
    }];
}

-(IBAction)showPicker:(id)sender
{
    [UIView animateWithDuration:0.3 animations:^{ 
        _pickerView.frame = CGRectMake(_pickerView.frame.origin.x,
                                       107, //Displays the view a little past the
                                            //center ling of the screen
                                       _pickerView.frame.size.width,
                                       _pickerView.frame.size.height);
    }];
}

И для вашего viewDidLoad просто вызовите «closePicker», чтобы скрыть представление при загрузке

1 голос
/ 05 июля 2016

В приложении, основанном на scrollView, показ и скрытие UIPickerView может быть сложной задачей, поскольку его относительно трудно прикрепить к нижней части видимого прямоугольника экрана. Вы можете сделать это легко с помощью следующего кода.

let alertController = UIAlertController(title: title, message: "\n\n\n\n\n\n\n\n\n\n", preferredStyle: .ActionSheet)
alertController.view.addSubview(pickerView)
alertController.addAction(UIAlertAction(title: "OK", style: .Cancel) { action in
})
self.presentViewController(alertController, animated: true, completion: nil)

Подводя итог, вы создаете UIAlertController с пустым сообщением. Для того чтобы alertController имел размер вашего pickerView, вы должны указать в сообщении необходимое количество разрывов строк. И, наконец, вы добавляете свой pickerView в качестве подпредставления alertController.view

Затем вы следуете за выбранными строками pickerView с помощью методов UIPickerViewDelegate.

0 голосов
/ 10 апреля 2016

Ниже приведен пример кода, который нужно скрыть и показать UIPickerView с анимацией: -

// Для отображения

-(void)showPickerView{
    self.pickerSheet = [UIAlertController alertControllerWithTitle:@"Select font" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
    self.pickerView = [[UIPickerView alloc]initWithFrame:CGRectZero];
    self.pickerView.dataSource = self;
    self.pickerView.delegate = self;
    self.pickerView.showsSelectionIndicator = YES;
    [self.pickerView selectRow:1 inComponent:0 animated:YES];
    [self.pickerSheet.view addSubview:self.pickerView];
    self.pickerView.translatesAutoresizingMaskIntoConstraints = NO;
    UIView *view = self.pickerView;
    [self.pickerSheet.view addConstraints:[NSLayoutConstraint
                               constraintsWithVisualFormat:@"V:|[view]|"
                               options:0l
                               metrics:nil
                               views:NSDictionaryOfVariableBindings(view)]];

    [self.pickerSheet.view addConstraints:[NSLayoutConstraint
                               constraintsWithVisualFormat:@"H:|[view]|"
                               options:0l
                               metrics:nil
                               views:NSDictionaryOfVariableBindings(view)]];
    [self presentViewController:self.pickerSheet animated:YES completion:^{
    }];

}

// Для сокрытия

-(void)hidePickerView{
    [self.pickerSheet dismissViewControllerAnimated:YES completion:^{
    }];
}
0 голосов
/ 14 января 2014

Я искал повсюду чистый способ скрывать и показывать (переключать) 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») и затем устанавливает заголовок кнопки вернуться к «Выбрать», который служит для завершения цикла всего действия.

Вероятно, более легкий путь для профессионалов, но для людей, которые являются новичками в этом, как я, это имело наиболее логичный смысл. Плюс это работает, так что это всегда бонус!

...