Как позиционировать UIScrollView под клавиатуру при изменении ориентации - PullRequest
2 голосов
/ 16 июня 2011

У меня есть UIScrollView, предназначенный для прокрутки, когда клавиатура поднята.Расположение портрета с прокруткой хорошо в портретном режиме;Я разместил его в Интерфейсном Разработчике и установил contentSize в своем коде ...

CGSize scrollContentSize = CGSizeMake(360, 221);
self.scrollView.contentSize = scrollContentSize;

Однако я изо всех сил пытаюсь понять, как изменить положение scrollview, чтобы оно работалоэффективно, когда ориентация меняется на ландшафт (и обратно).Нужно ли каким-то образом размещать его в Интерфейсном Разработчике для альбомной ориентации (?), А затем изменять размер содержимого в моем коде в зависимости от ориентации?

Редактировать: я получаю размер клавиатуры следующим образом и меняю содержимоеразмер.Это работает, когда я перехожу в Портрет, но рамка расположена немного неправильно в ландшафтном режиме.

 (void)keyboardWillShow:(NSNotification *)n{

    if (keyboardIsShown) {
    return;
    }

    NSDictionary* userInfo = [n userInfo];

    CGRect _keyboardEndFrame;
    [[userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&_keyboardEndFrame];
    CGFloat _keyboardHeight;
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown) {
    _keyboardHeight = _keyboardEndFrame.size.height;
    }
    else {
        _keyboardHeight = _keyboardEndFrame.size.width;
    }

    // resize the noteView
    CGRect viewFrame = self.scrollView.frame;
     viewFrame.size.height -= _keyboardHeight;

    if (UIDeviceOrientationIsPortrait(orientation)){
        CGSize scrollContentSize = CGSizeMake(360, 221);
        self.scrollView.contentSize = scrollContentSize;
    }
    else if (UIDeviceOrientationIsLandscape(orientation)){
        CGSize scrollContentSize = CGSizeMake(520, 275);
        self.scrollView.contentSize = scrollContentSize;
    }

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3];
    [self.scrollView setFrame:viewFrame];
    [UIView commitAnimations];

    keyboardIsShown = YES;
}

Ответы [ 2 ]

5 голосов
/ 17 июня 2011

То, что вы хотите сделать, это выяснить, где верхняя часть клавиатуры относительно представления, содержащего ваш scrollView. К счастью, в UIView есть функция с именем convertRect:fromView:, которая берет кадр из одной системы координат и отображает его в другой системе координат. В вашем случае вы знаете рамку клавиатуры относительно основного окна, но хотели бы знать, где верхняя часть клавиатуры относительно представления, содержащего ваш scrollView. Как только вы узнаете, где верхняя часть клавиатуры пересекается с вашим видом, вы можете изменить высоту вашего scrollView в соответствии с вашими потребностями.

Ниже приведен фрагмент кода, который я использую, который я нашел где-то в Интернете и за который не берут кредит. В вашем контроллере представления вы хотите получать уведомления о событиях отображения и скрытия клавиатуры:

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

Затем реализуйте keyboardWillShow: и keyboardWillHide: следующим образом:

// When the keyboard shows resize self.textView to touch the top of the keyboard.
-(void)keyboardWillShow:(NSNotification *)_notification {
    NSDictionary  *userInfo = [_notification userInfo];

    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    CGRect keyboardEndFrame;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];

        // Here we figure out where the keyboard overlaps with self.view
        // self.view contains self.textView
    CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame fromView:nil];
    CGFloat textViewWidth = self.view.frame.size.width;

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];
    self.textView.frame = CGRectMake(0, 0, textViewWidth, keyboardFrame.origin.y);
    [UIView commitAnimations];
}

// When the keyboard hides return self.textView to fullscreen
-(void)keyboardWillHide:(NSNotification *)_notification {
    NSDictionary  *userInfo = [_notification userInfo];

    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    CGRect keyboardEndFrame;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];
    self.textView.frame = self.view.frame;
    [UIView commitAnimations];  
}

Фрагмент содержит некоторые дополнительные материалы для анимации перехода синхронно с анимацией клавиатуры.

В этом фрагменте я использую self.textView, который вы, вероятно, захотите изменить на self.scrollView. Что хорошего в этом коде, так это то, что он работает во всех направлениях и на iPad. Посмотрите на код, и, надеюсь, он станет понятен.

0 голосов
/ 16 июня 2011

используйте этот метод для проверки ориентации и изменения содержимого. Размер scrollView в соответствии с ориентацией

  • (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation
...