Анимация 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,380myViewController.view
это подвидself.view
myViewController.view.frame
составляет 320,0 320,480 вself.view
система координат, так что она находится за пределами кадра своего суперпредставления (и за правым краем экрана)
Теперь рассмотрим, где находятся виды после завершения анимации:
self.view.frame
-320,0,320,480myViewController.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 для смены контроллеров представления без использования стека навигационных контроллеров, подпредставлений или модальных контроллеров? для примера того, как реализовать контроллер представления контейнера. Это просто изменить мой пример, чтобы сделать слайд в анимации, которую вы хотите.