Intereting Posts
Как настроить RestKit для сохранения основных данных? UITableView все выравнивание по левому краю – ошибка Проблемы с Flexbox с iOS 6 как инициализировать объект AVCaptureMetadataOutput? Tableview обновляется только после того, как я покинул представление и вернусь Environment.GetFolderPath (Environment.SpecialFolder.Personal) возвращает разные пути в другом месте Как добавить subview с перетаскиванием в анимацию сверху, в iOS? Избирательные ячейки iOS UiTableViewCell для отображения аксессуаров Получение сигнала sigabrt исключение, не может найти ошибку Анимация останавливается после перехода на другой контроллер вида NSString для NSDate возвращает неверную дату iOS, сохраняющие объекты в области действия, выполняющие задачу в фоновом режиме Изменения SQLite не сохранены iOS FadeIn / FadeOut во время подкачки Получение deeplink в уведомлении, полученном, когда приложение было закрыто

Перемещение 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]; } 

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