Подпредставление, добавленное в пользовательском переходе, пропало, когда появилось родительское представление.

Я реализую пользовательский переход с анимацией масштабирования между представлением A и представлением B. Моя мысль описана ниже.

Когда переход идет от A к B:

  1. Сохраните моментальный снимок представления B, добавьте это изображение в представление A в качестве подпредставления A.

  2. Выполнить анимацию увеличения фальшивого изображения (она действует так, как будто вид B становится все больше и больше, пока не заполнит весь экран)

  3. Когда анимация увеличения завершится, нажмите настоящий вид B без анимации с помощью навигационного контроллера и удалите фальшивый вид изображения из вида A.

Когда переход идет от B к A (раскрутка):

  1. Сохраните снимок вида B, добавьте его в вид A в качестве подвида A и переместите на передний план.

  2. Представление Pop B без анимации с использованием навигационного контроллера

  3. Выполнить анимацию уменьшения фальшивого изображения (она действует так, как будто вид B становится все меньше и меньше, пока не станет слишком маленьким, чтобы его можно было увидеть)

Он отлично работает в случае от A до B, в то время как в случае от B до A, после шага 2, реальный вид B должен исчезнуть, и поверх представления A появится фальшивое изображение B. Здесь возникает проблема: если представление поддельного изображения B не было удалено из подвидов представления A после шага 3, когда появляется представление A, B все еще должно существовать в подпредставлениях A, но кажется, что это подпредставление исчезло.

Я обнаружил ту же проблему здесь: Переход просмотра не анимируется во время пользовательского pop segue, но на него никто не отвечал.

Итак, у кого-нибудь есть идеи?


person Aries    schedule 08.10.2013    source источник


Ответы (1)


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

Этот код работает:

    //ZoomInSegue.m
    - (void)perform {
        UIViewController* source = (UIViewController *)self.sourceViewController;
        UIViewController* destination = (UIViewController *)self.destinationViewController;

        //Custom method to create an UIImage from a UIView
        UIImageView * destView = [[UIImageView alloc] initWithImage:[self imageWithView:destination.view]];             

        CGRect destFrame = destView.frame;
        destFrame.origin.x = destination.view.frame.size.width/2;
        destFrame.origin.y = destination.view.frame.size.height/2;
        destFrame.size.width = 0;
        destFrame.size.height = 0;
        destView.frame = destFrame;

        destFrame = source.view.frame;

        [source.view addSubview:destView];

        [UIView animateWithDuration:1.0
                         animations:^{
                             destView.frame = destFrame;
                         }
                         completion:^(BOOL finished) {
                             [destView removeFromSuperview];
                             [source.navigationController pushViewController:destination animated:NO];
                         }];
    }

    //ZoomOutSegue.m
    - (void)perform {
        UIViewController* source = (UIViewController *)self.sourceViewController;
        UIViewController* destination = (UIViewController *)self.destinationViewController;

        //Custom method to create an UIImage from a UIView
        UIImageView* sourceView = [[UIImageView alloc] initWithImage:[self imageWithView:source.view]]; 

        CGRect sourceFrame = sourceView.frame;
        sourceFrame.origin.x = source.view.frame.size.width/2;
        sourceFrame.origin.y = source.view.frame.size.height/2;
        sourceFrame.size.width = 0;
        sourceFrame.size.height = 0;

        [source.view addSubview:destination.view];
        [source.view addSubview:sourceView];

        [UIView animateWithDuration:1.0
                         animations:^{
                             sourceView.frame = sourceFrame;
                         }
                         completion:^(BOOL finished) {
                             [source.navigationController popViewControllerAnimated:NO];
                         }];
    }
person Odrakir    schedule 08.10.2013
comment
Большое спасибо @Odrakir, ваш совет работает. Я сделал еще несколько проб, кажется, что в пользовательском переходе экземпляр выскочившего контроллера не совпадал с экземпляром контроллера назначения перехода. Это может объяснить, почему изменения в представлении назначения в переходе исчезли, когда оно, наконец, отображается на экране после выталкивания, но механизм, лежащий в основе перехода и навигационного контроллера, все еще меня смущает: почему переход должен создавать экземпляр нового контроллера назначения, но он сохраняет представление назначения статус, когда представление было выскочило. - person Aries; 09.10.2013