изменение размера UIScrollView с помощью блока анимации перемещает начало координат - PullRequest
5 голосов
/ 18 января 2012

Я нахожусь в процессе прокрутки UIScrollView вверх, если клавиатура скрывает UITextField.Я уменьшу высоту UIScrollView, если он будет скрыт, который работает нормально.но когда я пытаюсь увеличить высоту UIScrollView (обратно к исходному размеру), весь UIScrollView перемещается вверх, а затем анимируется до исходного размера и местоположения.источник перемещается вверх на величину X и перемещается туда, где он должен быть, вместо высоты расширяющегося вида вниз.

- (void)keyboardWillShow:(NSNotification *)n
{
    keyboardMove = self.rightScrollView.frame;
    offsetMove = self.rightScrollView.contentOffset;

    NSDictionary* userInfo = [n userInfo];

    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    [UIView animateWithDuration:.25
                          delay:0
                        options:(UIViewAnimationOptionAllowUserInteraction)
                     animations:^
                     {
                         self.rightScrollView.frame = CGRectMake(self.rightScrollView.frame.origin.x, self.rightScrollView.frame.origin.y, self.rightScrollView.frame.size.width, (self.view.frame.size.height - (self.rightScrollView.frame.origin.y + keyboardSize.height)));
                     }
                     completion:nil];

    if ((activeTextField.frame.origin.y + activeTextField.frame.size.height) > self.rightScrollView.frame.size.height)
    {        
        float contentOffsetMove = (self.rightScrollView.contentOffset.y + (activeTextField.frame.origin.y - self.rightScrollView.frame.size.height) + activeTextField.frame.size.height + 10);

        self.rightScrollView.contentOffset = CGPointMake(self.rightScrollView.contentOffset.x, contentOffsetMove);
    }
}

- (void)keyboardWillHide:(NSNotification *)n
{
    if ((activeTextField.frame.origin.y + activeTextField.frame.size.height) > self.rightScrollView.frame.size.height)
    {
        [UIView animateWithDuration:.25
                              delay:0
                            options:(UIViewAnimationOptionAllowUserInteraction)
                         animations:^{
                             [self.rightScrollView setContentOffset:offsetMove animated:YES];

                             self.rightScrollView.frame = keyboardMove;
                         }
                         completion:nil];

    }
    else
    {
        [UIView animateWithDuration:.25
                              delay:0
                            options:(UIViewAnimationOptionAllowUserInteraction)
                         animations:^{
                             self.rightScrollView.frame = keyboardMove;
                         }
                         completion:nil];
    }
}

, поэтому, когда клавиатура скрывается, self.rightScrollView.origin перемещается вверх по точкам X итогда оживляет до локации это должно быть.мне нужно, чтобы источник оставался на месте, а высота стала больше (растет вниз).

есть идеи, почему он ведет себя глупо?

Ответы [ 3 ]

3 голосов
/ 19 февраля 2013

Я не знаю, если вы все еще заинтересованы в ответе, так как я вижу последнее действие здесь было год назад, но сегодня я наткнулся на точно такую ​​же проблему в iOS 6 и решил поделиться своим решением с кем-либо еще интересно.

Я заметил, что смещение, на которое UIScrollView перемещается вверх, вдвое меньше высоты клавиатуры, но только в том случае, если содержимое UIScrollView смещено. Таким образом, мой обходной путь состоял в том, чтобы переместить UIScrollView DOWN с точно такой же величиной непосредственно перед анимацией, если смещение содержимого UIScrollView больше 0. Это прекрасно работает как на iPhone 4 (дисплей 3,5 дюйма), так и на iPhone 5 (дисплей 4 дюйма) для сейчас, но я не знаю, что произойдет, если Apple решит это исправить, если это действительно ошибка UIKit.

В любом случае, вот мой код для ясности:

- (void)keyboardWillHide:(NSNotification *)notification
{
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    if (self.scrollView.contentOffset.y > 0) {
        CGRect f = CGRectMake(0, keyboardSize.height / 2, self.scrollView.frame.size.width, self.scrollView.frame.size.height);
        self.scrollView.frame = f;
    }

    [UIView animateWithDuration:0.25 animations:^{
        self.scrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    }];
}
2 голосов
/ 18 января 2012

Я считаю, что это потенциально ошибка в UIKit, но способ обойти это - работать с scrollView's contentInset вместо регулировки кадра. Итак:

Вместо

self.rightScrollView.frame = CGRectMake(self.rightScrollView.frame.origin.x,
                                        self.rightScrollView.frame.origin.y,
                                        self.rightScrollView.frame.size.width,
                                        (self.view.frame.size.height - (self.rightScrollView.frame.origin.y + keyboardSize.height)));

сделать

self.rightScrollView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0);
0 голосов
/ 18 января 2012

Вы пытались объяснить анимацию именно так, как вы хотите, чтобы это произошло? То есть если вы хотите увеличить высоту, сделайте это. Вместо

self.rightScrollView.frame = keyboardMove; 

вы могли бы сделать

CGRect f = self.rightScrollView.frame;
f.size.height += keyboardMove.size.height - f.size.height;
self.rightScrollView.frame = f; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...