Отключить UIPickerView динамически через скрипт или через раскадровку - PullRequest
0 голосов
/ 11 декабря 2011

У меня много проблем с реализацией UIPickerView на iOS. Я хотел бы показать средство выбора для заполнения определенного поля, но только когда поле выбрано, и отклонить (или скрыть) средство выбора в других случаях. Возможно с анимацией.

  • раскадровка:

Мне удалось связать его с розеткой, заполнить и показать на моем ViewController. Но я не смог динамически закрыть (или скрыть) UIPickerView с раскадровкой. Я пробовал с:

pickerView.hidden = YES;

но это не сработало. Есть идеи?


  • КОДИРОВАНИЕ

Я попытался реализовать мой инструмент выбора программно:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
//if click on fieldWithPicker, dismiss the keyaboard and load the picker
if (textField == fieldWithPicker)
{        
    //dismiss the keyboard of fieldWithoutPicker
    [fieldWithoutPicker resignFirstResponder];
    // Check if the picker is already on screen. If so, skip creating picker view and go to handling choice
    if (myPickerView.superview == nil)
    {           
        //Make picker
        myPickerView = [[UIPickerView alloc] initWithFrame:CGRectZero];
        CGSize pickerSize = [myPickerView sizeThatFits:CGSizeZero];
        myPickerView.frame = [self pickerFrameWithSize:pickerSize];
        myPickerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        myPickerView.showsSelectionIndicator = YES;
        // this view controller is the data source and delegate
        myPickerView.delegate = self;
        myPickerView.dataSource = self;

        // Add the picker
        [self.view.window addSubview: myPickerView];

        // size up the picker view to our screen and compute the start/end frame origin for our slide up animation
        // compute the start frame
        CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
        CGRect startRect = CGRectMake(0.0, screenRect.origin.y + screenRect.size.height, pickerSize.width, pickerSize.height);
        mypickerView.frame = startRect;
        // compute the end frame
        CGRect pickerRect = CGRectMake(0.0, screenRect.origin.y + screenRect.size.height - pickerSize.height-100, pickerSize.width, pickerSize.height);

        // start the slide up animation
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:PICKER_ANIMATION_DURATION];
        // Give time for the table to scroll before animating the picker's appearance
        [UIView setAnimationDelay:PICKER_ANIMATION_DELAY];

        // we need to perform some post operations after the animation is complete
        [UIView setAnimationDelegate:self];
        myPickerView = pickerRect;
        [UIView commitAnimations];
    }
    //we don't want keyboard, since we have a picker
    return NO;
}

//if click on fieldWithoutPicker, dismiss the picker and load the keyboard
if (textField == fieldWithoutPicker)
{
    [self hidePickerContinenteView];
}
return YES;
}

Затем я реализовал свою hidePickerContinenteView функцию для перемещения за пределы сборщика:

- (void) hidePickerContinenteView
{
CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
CGRect endFrame = self.view.frame;
endFrame.origin.y = screenRect.origin.y + screenRect.size.height;

// start the slide down animation
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:PICKER_ANIMATION_DURATION];

// we need to perform some post operations after the animation is complete
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(slideDownDidStop)];

pickerContinenteView.frame = endFrame;
[UIView commitAnimations];
}

На данный момент у меня две основные проблемы:

  • В методе textFieldShouldBeginEditing я проверяю, что PickerView уже существует, и в случае, если ничего не сделано. В методе hidePickerContinenteView я скрываю средство выбора, но PickerView продолжает существовать: это означает, что в следующий раз, когда я нажимаю на fieldWithPicker, средство выбора не отображается. Я попытался использовать в методе hidePickerContinenteView следующее: [pickerContinenteView removeFromSuperview]; но это сразу же закрывает PickerView и, соответственно, анимация не отображается. Есть идеи?

  • Если отображается средство выбора, и пользователь меняет представление, например, щелкая другую вкладку или кнопку «Назад», средство выбора не закрывается. Есть идеи по этому поводу?

Спасибо заранее, Яс

1 Ответ

0 голосов
/ 11 декабря 2011

Я бы подошел к этому, создав и поместив палитру в раскадровку там, где вы хотите, чтобы она была, когда она видна и используется.Установите флажок скрытый в инспекторе атрибутов, чтобы он был скрыт при загрузке представления.Убедитесь, что он находится над любым другим представлением, которое у вас есть в раскадровке.Затем код вашего контроллера представления, чтобы использовать скрытое свойство, чтобы показать его и снова скрыть.Вы все еще можете использовать анимацию для изменения скрытого свойства.

Чтобы скрыть средство выбора, используйте:

[templatePicker setHidden:YES];

и чтобы показать средство выбора:

[templatePicker setHidden:NO];
...