клавиатура скрывает текстовое поле для различной ориентации в iPad - PullRequest
0 голосов
/ 09 января 2012

В моем приложении для iPad у меня есть несколько textView и textField's. Когда я нажимаю textField, клавиатура закрывает textField. Поэтому я реализую код ниже, чтобы переместить текстовое представление вверх. Но при вращении до portraitUpsideDown не работает нормально. Он сдвигает экран вниз в противоположном направлении. Так как мне решить эту проблему ??

-(void) animateTextField: (UITextView *) textField up: (BOOL) up
{
    int txtPosition = (textField.frame.origin.y - 540);
    const int movementDistance = (txtPosition < 0 ? 0 : txtPosition); // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

-(void)textViewDidBeginEditing:(UITextView *)textField
{
    [self animateTextField: textField up: YES];
}

-(void)textViewDidEndEditing:(UITextView *)textField
{
    [self animateTextField: textField up: NO];
}

-(BOOL)textFieldShouldReturn:(UITextView *)theTextField
{
    [theTextField resignFirstResponder];
    return YES;
}

Ответы [ 4 ]

0 голосов
/ 01 октября 2015

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

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardDidHideNotification object:nil];

}

- (void)keyboardWillShow:(NSNotification *)notification {
    CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat keyboardHeight = CGRectGetHeight(keyboardFrame);
    CGFloat animationDuration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
    UIViewAnimationCurve animationCurve = [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];
    UIViewAnimationOptions animationOption = animationCurve << 16;

    [UIView animateWithDuration:animationDuration delay:0 options:animationOption animations:^{
        // adjust height using keyboardHeight
    } completion:^(BOOL finished) {

    }];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat keyboardHeight = CGRectGetHeight(keyboardFrame);
    CGFloat animationDuration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
    UIViewAnimationCurve animationCurve = [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];
    UIViewAnimationOptions animationOption = animationCurve << 16;

    [UIView animateWithDuration:animationDuration delay:0 options:animationOption animations:^{
        // adjust height using keyboardHeight
    } completion:^(BOOL finished) {

    }];
}

В этом блоге это подробно объясняется

http://charlie.cu.cc/2015/10/solution-to-the-ios-software-keyboard-cover-part-of-the-ui/

0 голосов
/ 07 февраля 2012

Это решение для iPhone, но оно учитывает обе ориентации.

Вы можете немного адаптировать и вуаля:

http://cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html

0 голосов
/ 12 июля 2012

Сумасшедший

Просто добавьте еще одну функцию:

- (void) animateTextView: (UITextView*) textView up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

Тогда назовите это как:

- (void)textViewDidBeginEditing:(UITextView *)textView {
    [self animateTextView: textView up: YES];
}

- (void)textViewDidEndEditing:(UITextView *)textView {
    [self animateTextView: textView up: NO];
}
0 голосов
/ 09 января 2012

Если ваш метод такой.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

Попробуйте это.Я точно не знаюНо я пытаюсь тебе помочь.Может быть координаты x и y не могут быть изменены в любой ориентации.так попробуйте это.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  {
     if(interfaceOrientation=UIInterfaceOrienationPotraitUpsideDown){
          //Declare txtPos globally...
          txtPos=(textField.frame.origin.y + 540);
      }
     if(interfaceOrientation=UIInterfaceOrienationPotrait)
      {
          txtPos=(textField.frame.origin.y - 540);
      }
    return(YES);
  }

в одушевленном методе.присвойте textPos переменной txtPosition ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...