У меня много проблем с реализацией 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 и, соответственно, анимация не отображается.
Есть идеи?
Если отображается средство выбора, и пользователь меняет представление, например, щелкая другую вкладку или кнопку «Назад», средство выбора не закрывается. Есть идеи по этому поводу?
Спасибо заранее,
Яс