UIView блок анимации переходов с анимированным контентом при показе / скрытии клавиатуры - PullRequest
1 голос
/ 19 апреля 2011

В моем приложении у меня есть текстовое поле в каком-то виде, которое закрывается клавиатурой, когда оно появляется.Так что я должен прокрутить представление (или даже переставить подпредставления).Для этого я:

  1. регистрируюсь для уведомлений клавиатуры:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(moveViewUp)
                                          name:UIKeyboardWillShowNotification
                                          object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(moveViewDown)
                                          name:UIKeyboardWillHideNotification
                                          object:nil];
    
  2. после получения уведомления перемещаю вид, используя блочную анимацию, подобную этой:

    - (void)moveViewUp {
        void (^animations)(void) = nil;
        oldViewFrame = self.view.frame;
        animations = ^{
            CGRect newViewFrame = oldViewFrame;
            newViewFrame.origin.y -= kViewOffset;
            self.view.frame = newViewFrame;
        };
        [UIView animateWithDuration:1.0
                animations:animations];
    
    }
    
    - (void)moveViewDown {
        void (^animations)(void) = nil;
        animations = ^{
            self.view.frame = oldViewFrame;
        };
        [UIView animateWithDuration:1.0
                animations:animations];
    
    }
    

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

- (IBAction)switchToNextView:(id)sender {
    // [self presentModalViewController:nextViewController animated:YES];
    [UIView transitionFromView:self.view
                        toView:self.nextView
                      duration:1.0
                       options:UIViewAnimationOptionTransitionFlipFromRight
                    completion:nil];
}

Теперь мы подошли к проблеме.
Если первое представление было смещено при нажатии кнопки (чтоозначает, что клавиатура была видимой), переход к следующему представлению начинается одновременно с скольжением клавиатуры вниз, но само представление не перемещается вниз , поэтому в течение доли секунды мы можем фактически увидеть базовое представление,Это не правильно.Когда я представляю следующий вид модально (см. Закомментированную строку), все анимации идут так, как я хочу: т. Е. Клавиатура прячется, вид переворачивается справа и , прокручивая вниз - все одновременно,Это было бы хорошо, но проблема в том, что у меня на самом деле нет UIViewController для этого представления.На самом деле я пытаюсь смоделировать модальное поведение без UIViewController (почему так? возможно, это просто плохой дизайн, я выложу еще один вопрос по этому вопросу ).

Так почему же в этом случае анимация из метода moveViewDown не запускается в нужное время?

Обновление 1

Я добавил отладочную печать для каждой функции впроверьте порядок звонков, вот что я получаю:

-[KeyboardAnimationViewController moveViewUp]
__-[KeyboardAnimationViewController moveViewUp]_block_invoke_1 <-- scroll up animation
-[KeyboardAnimationViewController switchToNextView:]
-[KeyboardAnimationViewController moveViewDown]
__-[KeyboardAnimationViewController moveViewDown]_block_invoke_1 <-- scroll down animation

Даже если я передвигаю вид вниз перед переходом, как это

- (IBAction)switchToNextView:(id)sender {
    // [self presentModalViewController:nextViewController animated:YES];
    NSLog(@"%s", __PRETTY_FUNCTION__);
    if (self.view.frame.origin.x < 0)
        [self moveViewDown];
    [UIView transitionFromView:self.view
                        toView:self.nextView
                      duration:1.0
                       options:UIViewAnimationOptionTransitionFlipFromRight
                    completion:nil];
}

Я получаю точно тот же журнал.

Обновление 2

Я экспериментировал еще немного и сделал следующие выводы:

  1. Если я позвоню moveViewDown или resignFirstResponder:явно анимация откладывается до конца текущего цикла выполнения, когда все ожидающие анимации фактически начинают воспроизводиться.Хотя блок анимации сразу записывается на консоль - мне кажется странным!
  2. Метод transitionFromView:toView:duration:options:completion: (возможно, transitionWithView:duration:options:animations:completion: тоже не проверял этот), очевидно, делаетснимок «from-view» и «to-view» и создает анимацию, используя исключительно эти снимки.Поскольку прокрутка представления откладывается, снимок сделан, когда представление все еще смещено.Этот метод каким-то образом игнорирует даже параметр UIViewAnimationOptionAllowAnimatedContent .
  3. Мне удалось получить желаемый эффект, используя любой из animateWithDuration: ... completion: методов.Кажется, что эти методы игнорируют параметры перехода подобно UIViewAnimationOptionTransitionFlipFromRight.
  4. Клавиатура начинает скрываться (неявно) и отправляет соответствующее уведомление при вызове removeFromSuperview.

Пожалуйста, поправьте меня, если я где-то ошибаюсь.

1 Ответ

0 голосов
/ 21 апреля 2011

Если вы пытаетесь смоделировать модальное поведение без UIViewController Полагаю, вы хотите, чтобы ваш следующий вид отображался внизу экрана справа ?.поправь меня если я не прав.Если вам нужна такая анимация, вы можете попробовать обойти, где вы изменяете кадр следующего вида в блоке animation так, что он выглядит так, как будто он похож на presentModalViewController

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