Перемещение UIView при выборе UITextField

Я пытаюсь программно создать некоторые текстовые поля. Они отображаются в нижней части экрана, и при выборе клавиатуры их закрывает. Мне нужно переместить представление, когда будет выбрано текстовое поле.

Вот мой код для представления:

Заголовок:

@interface MESLoginViewController : UIViewController <PFLogInViewControllerDelegate, UITextFieldDelegate> { IBOutlet UITextField *usernameField; } 

Imp Просмотр файла:

 // Create sub view for Logo UIView *logoView =[[UIView alloc] initWithFrame:CGRectMake(0,0,320,280)]; [logoView setBackgroundColor:[UIColor blueColor]]; logoView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; // Create sub view for fields UIView *fieldView = [[UIView alloc] initWithFrame:CGRectMake(0, logoView.bounds.size.height, 320, 200)]; [fieldView setBackgroundColor:[UIColor greenColor]]; fieldView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin; // Setting up the text fields // Username field usernameField = [[UITextField alloc] initWithFrame:CGRectMake(10, 20, 300, 40)]; usernameField.borderStyle = UITextBorderStyleRoundedRect; usernameField.textColor = [UIColor blackColor]; usernameField.font = [UIFont systemFontOfSize:17.0]; usernameField.placeholder = @"Username"; usernameField.backgroundColor = [UIColor whiteColor]; usernameField.autocorrectionType = UITextAutocorrectionTypeNo; usernameField.keyboardType = UIKeyboardTypeDefault; usernameField.returnKeyType = UIReturnKeySearch; usernameField.clearButtonMode = UITextFieldViewModeWhileEditing; usernameField.delegate = self; // Password field UITextField *passwordField = [[UITextField alloc] initWithFrame:CGRectMake(10, (usernameField.bounds.size.height + 30), 300, 40)]; passwordField.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin; passwordField.borderStyle = UITextBorderStyleRoundedRect; passwordField.textColor = [UIColor blackColor]; passwordField.font = [UIFont systemFontOfSize:17.0]; passwordField.placeholder = @"Password"; passwordField.backgroundColor = [UIColor whiteColor]; passwordField.autocorrectionType = UITextAutocorrectionTypeNo; passwordField.keyboardType = UIKeyboardTypeDefault; passwordField.returnKeyType = UIReturnKeySearch; passwordField.clearButtonMode = UITextFieldViewModeWhileEditing; passwordField.delegate = self; // Add fields/button to fieldView [fieldView addSubview:usernameField]; [fieldView addSubview:passwordField]; // Add subviews to main view [self.view addSubview:logoView]; [self.view addSubview:fieldView]; 

Я добавил этот метод для перемещения представления, но не могу правильно обработать последнюю часть:

 - (void)textFieldDidBeginEditing:(UITextField *)textField{ NSLog(@"textFieldDidBeginEditing"); //If we begin editing on the text field we need to move it up to make sure we can still //see it when the keyboard is visible. //I am adding an animation to make this look better [UIView beginAnimations:@"Animate Text Field Up" context:nil]; [UIView setAnimationDuration:.3]; [UIView setAnimationBeginsFromCurrentState:YES]; usernameField.frame = CGRectMake(usernameField.frame.origin.x, -200, usernameField.frame.size.width, usernameField.frame.size.height); [UIView commitAnimations]; } 

То, что я на самом деле ищу, – полностью переместить представление или, возможно, изменить его на прокручиваемую область выше. Хотя я применяю другой метод после touch to endEditing.

Кажется, если я переместил одно поле, мне пришлось бы выполнить код, чтобы переместить все … Как просто переместить представление (полный вид)?

Также, что нужно, чтобы представление возвращалось в нормальное состояние в методе textFieldDidEndEditing | textFieldShouldEndEditing?

Когда вы выбираете анимацию после того, как клавиатура будет выбрана, выберите анимировать весь вид.

Сначала объявите переменную UIView, чтобы сделать ее доступной:

 @interface MESLoginViewController : UIViewController <PFLogInViewControllerDelegate, UITextFieldDelegate> { IBOutlet UITextField *usernameField; UIView *fieldView; } 

Затем создайте это представление в своей реализации

  // Create sub view for Logo UIView *logoView =[[UIView alloc] initWithFrame:CGRectMake(0,0,320,280)]; [logoView setBackgroundColor:[UIColor blueColor]]; logoView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; // Create sub view for fields fieldView = [[UIView alloc] initWithFrame:CGRectMake(0, logoView.bounds.size.height, 320, 200)]; [fieldView setBackgroundColor:[UIColor greenColor]]; fieldView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin; // Setting up the text fields // Username field usernameField = [[UITextField alloc] initWithFrame:CGRectMake(10, 20, 300, 40)]; usernameField.borderStyle = UITextBorderStyleRoundedRect; usernameField.textColor = [UIColor blackColor]; usernameField.font = [UIFont systemFontOfSize:17.0]; usernameField.placeholder = @"Username"; usernameField.backgroundColor = [UIColor whiteColor]; usernameField.autocorrectionType = UITextAutocorrectionTypeNo; usernameField.keyboardType = UIKeyboardTypeDefault; usernameField.returnKeyType = UIReturnKeySearch; usernameField.clearButtonMode = UITextFieldViewModeWhileEditing; usernameField.delegate = self; // Password field UITextField *passwordField = [[UITextField alloc] initWithFrame:CGRectMake(10, (usernameField.bounds.size.height + 30), 300, 40)]; passwordField.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin; passwordField.borderStyle = UITextBorderStyleRoundedRect; passwordField.textColor = [UIColor blackColor]; passwordField.font = [UIFont systemFontOfSize:17.0]; passwordField.placeholder = @"Password"; passwordField.backgroundColor = [UIColor whiteColor]; passwordField.autocorrectionType = UITextAutocorrectionTypeNo; passwordField.keyboardType = UIKeyboardTypeDefault; passwordField.returnKeyType = UIReturnKeySearch; passwordField.clearButtonMode = UITextFieldViewModeWhileEditing; passwordField.delegate = self; // Add fields/button to fieldView [fieldView addSubview:usernameField]; [fieldView addSubview:passwordField]; // Add subviews to main view [self.view addSubview:logoView]; [self.view addSubview:fieldView]; 

Затем анимируйте полевой вид:

 - (void)textFieldDidBeginEditing:(UITextField *)textField{ NSLog(@"textFieldDidBeginEditing"); //If we begin editing on the text field we need to move it up to make sure we can still //see it when the keyboard is visible. //I am adding an animation to make this look better [UIView beginAnimations:@"Animate Text Field Up" context:nil]; [UIView setAnimationDuration:.3]; [UIView setAnimationBeginsFromCurrentState:YES]; fieldView.frame = CGRectMake(fieldView.frame.origin.x, -200, fieldView.frame.size.width, fieldView.frame.size.height); [UIView commitAnimations]; 

}

Поскольку все текстовые поля являются областями fieldView, они будут анимироваться вместе с ним. Это должно сортировать!

Вы получаете доступ к локальной переменной usernameField в методе моего друга. Это ошибка компилятора.

Если мое понимание правильное – вы действительно хотите переместить «fieldView» – потому что два UITextFields являются Subviews этого представления.

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

Просто используйте следующий код в ваших файлах .h и .m, он отлично работает для меня.

——-.час—–

 CGFloat animatedDistance; 

——– м. ———-

 static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3; static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2; static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8; static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 216; static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 162; - (void)textFieldDidBeginEditing:(UITextField *)textField { CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField]; CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view]; CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height; CGFloat numerator = midline - viewRect.origin.y - MINIMUM_SCROLL_FRACTION * viewRect.size.height; CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) * viewRect.size.height; CGFloat heightFraction = numerator / denominator; if (heightFraction < 0.0) { heightFraction = 0.0; } else if (heightFraction > 1.0) { heightFraction = 1.0; } UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) { animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction); } else { //animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction); } CGRect viewFrame = self.view.frame; viewFrame.origin.y -= animatedDistance; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; [self.view setFrame:viewFrame]; [UIView commitAnimations]; } - (void)textFieldDidEndEditing:(UITextField *)textField { CGRect viewFrame = self.view.frame; viewFrame.origin.y += animatedDistance; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; [self.view setFrame:viewFrame]; [UIView commitAnimations]; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } - (IBAction) textFieldReturn:(id)textField { [textField resignFirstResponder]; } 

У меня есть решение здесь