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

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

2 голосов
/ 30 ноября 2011

Я пытаюсь имитировать 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 ]

3 голосов
/ 30 ноября 2011

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

  • self.view.frame - это (я полагаю) 0,0 320,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 320,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];
}];
1 голос
/ 30 ноября 2011

Не могу сказать, есть ли у вас другие проблемы, связанные с контекстом, где этот код вызывается. Похоже, 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 является контроллером представления контейнера, я ожидаю, что логика будет там. См. Мой ответ на Анимированное изменение контроллеров представления без использования стека навигационных контроллеров, подпредставлений или модальных контроллеров? для примера того, как реализовать контроллер представления контейнера. Это просто изменить мой пример, чтобы сделать слайд в анимации, которую вы хотите.

...