Анимация self.view.frame?

Я пытаюсь имитировать pushViewController UINavigationController с помощью анимации UIView, но я, кажется, столкнулся с проблемой. Я не могу оживить self.view.frame.

Это код, который я использую, но self.view просто не будет двигаться!

    [self.view addSubview:myViewController.view];
    [myViewController.view setFrame:CGRectMake(320, 0, 320, 480)];    
    [UIView animateWithDuration:0.5 
                     animations:^{
                         [self.view setFrame:CGRectMake(-320, 0, 320, 480)];
                         [myViewController.view setFrame:CGRectMake(0, 0, 320, 480)];
                     }
                     completion:^(BOOL finished){
                         [view1.view removeFromSuperview];
                     }];

Спасибо!

2 ответа

Решение

Посмотрите, где находятся виды непосредственно перед началом анимации:

  • self.view.frame является (я предполагаю) 0,0,33,380
  • myViewController.view это подвид self.view
  • myViewController.view.frame составляет 320,0 320,480 в self.view система координат, так что она находится за пределами кадра своего суперпредставления (и за правым краем экрана)

Теперь рассмотрим, где находятся виды после завершения анимации:

  • self.view.frame -320,0,320,480
  • myViewController.view все еще является подпредставлением self.view
  • myViewController.view.frame 0,0 320,480 в self.view система координат, поэтому она полностью находится внутри кадра своего суперпредставления, но ее кадр в экранных координатах равен -320,0,33,480, поэтому теперь он полностью находится за левым краем экрана

Вам нужно сделать myViewController.view родной брат self.view, а не подпредставление. Попробуй это:

// Calculate the initial frame of myViewController.view to be
// the same size as self.view, but off the right edge of self.view.
// I don't like hardcoding coordinates...
CGRect frame = self.view.frame;
frame.origin.x = CGRectGetMaxX(frame);
myViewController.view.frame = frame;
[self.view.superview addSubview:myViewController.view];
// Now slide the views over.
[UIView animationWithDuration:0.5 animations:^{
    CGRect frame = self.view.frame;
    myViewController.view.frame = frame;
    frame.origin.x -= frame.size.width;
    self.view.frame = frame;
} completion:^(BOOL done){
    [view1.view removeFromSuperview];
}];

Не могу сказать, есть ли у вас другие проблемы, связанные с контекстом, где этот код вызывается. Похоже view1 является подклассом UIViewController Вы должны переименовать это, довольно запутанно.

Я заметил проблему с вашими кадрами. Это выглядит как self является контроллером вида контейнера, например self.view содержит анимированные виды (view1.view а также myViewController.view и не должен быть анимирован сам. Если это правильно, ваша анимация должна быть:

[self.view addSubview:myViewController.view];
[myViewController.view setFrame:CGRectMake(320, 0, 320, 480)];    
[UIView animateWithDuration:0.5 
                 animations:^{
                     [view1.view setFrame:CGRectMake(-320, 0, 320, 480)];
                     [myViewController.view setFrame:CGRectMake(0, 0, 320, 480)];
                 }
                 completion:^(BOOL finished){
                     [view1.view removeFromSuperview];
                 }];

Кроме того, кажется странным, что контроллер представления оживляет себя из своего суперпредставления. Если self является контроллером представления контейнера, я ожидаю, что логика будет там. Смотрите мой ответ на Animate для смены контроллеров представления без использования стека навигационных контроллеров, подпредставлений или модальных контроллеров? для примера того, как реализовать контроллер представления контейнера. Это просто изменить мой пример, чтобы сделать слайд в анимации, которую вы хотите.

Другие вопросы по тегам