Я использую настраиваемый контроллер для переходов (не мог использовать контроллер навигации из-за присущих циклов в проекте, что позволило бы стеку навигационных контроллеров расти неограниченно [что я предполагаю, вопросы]). Я имитирую скользящую анимацию навигационных контроллеров (при переходе на новые экраны) с использованием UIView animateWithDuration: анимация: завершение:GMGridView появляется на экране, но накладывается на экранный вид
Когда нажата кнопка, запускающая переход, кадр нового вида, к которому я хочу перейти, установлен на внеэкранное положение. В анимации перехода (UIView animateWithDuration: анимация: завершение :) в настоящее время на экране отображается своя рамка, установленная в положение вне экрана, а новое представление установлено на экранную позицию.
Это внутри моего пользовательского контроллера для переходов:
CGFloat windowWidth = self.mainView.frame.size.width;
CGFloat windowHeight = self.mainView.frame.size.height;
CGRect offScreenLeft = CGRectMake(-1*windowWidth, 0.0, windowWidth, windowHeight);
CGRect onScreen = self.mainView.frame;
CGRect offScreenRight = CGRectMake(windowWidth, 0.0, windowWidth, windowHeight);
if (direction == TransitionDirectionForward)
{
if (dragBackgroundOnscreen){
[self.mainView addSubview:self.backgroundView];
[self.mainView sendSubviewToBack:self.backgroundView];
self.backgroundView.frame = offScreenRight;
}
self.currentViewController.view.frame = offScreenRight;
[UIView animateWithDuration:0.65
animations:^{
oldViewController.view.frame = offScreenLeft;
if (dragBackgroundOffscreen)
self.backgroundView.frame = offScreenLeft;
else if (dragBackgroundOnscreen)
self.backgroundView.frame = onScreen;
self.currentViewController.view.frame = onScreen;
}
completion:^(BOOL finished){
[oldViewController.view removeFromSuperview];
if (dragBackgroundOffscreen)
[self.backgroundView removeFromSuperview];
[oldViewController willMoveToParentViewController:nil];
[oldViewController removeFromParentViewController];
[self.currentViewController didMoveToParentViewController:self];
}];
}
else if (direction == TransitionDirectionBackward)
{
if (dragBackgroundOnscreen){
[self.mainView addSubview:self.backgroundView];
[self.mainView sendSubviewToBack:self.backgroundView];
self.backgroundView.frame = offScreenLeft;
}
self.currentViewController.view.frame = offScreenLeft;
[UIView animateWithDuration:0.65
animations:^{
oldViewController.view.frame = offScreenRight;
if (dragBackgroundOffscreen)
self.backgroundView.frame = offScreenRight;
else if (dragBackgroundOnscreen)
self.backgroundView.frame = onScreen;
self.currentViewController.view.frame = onScreen;
}
completion:^(BOOL finished){
[oldViewController.view removeFromSuperview];
if (dragBackgroundOffscreen)
[self.backgroundView removeFromSuperview];
[oldViewController willMoveToParentViewController:nil];
[oldViewController removeFromParentViewController];
[self.currentViewController didMoveToParentViewController:self];
}];
}
Я также хочу фон (self.backgroundView), чтобы оставаться статичным, если перемещение на экран, который имеет свой собственный фон (т.е. не я не хочу фона для слайда, если фон новых представлений является одним и тем же фоном).
Я использую TransitionDirectionBackward и TransitionDirectionForward, чтобы различать скользящие левые и скользящие права.
Все работает отлично, за исключением случаев, когда переход включает в себя GMGridView. проблема, когда кадр Gridviews установлен на внеэкранный фрейм, он действительно устанавливает свой кадр выбранной в данный момент страницы на эту заставку. Другие страницы gridview не ограничены этим фреймом, поэтому они могут отображаться на экране еще до перехода. Я попытался установить свойство frame и bounds в представлении ViewController GridView, но я все еще могу получить страницу gridview, появляющуюся на экране перед анимацией перехода.
Кто-нибудь видит решение этой проблемы? Я пытался найти способ обрезать представление GridView во время перехода, поэтому страницы не отображаются, кроме текущей выбранной страницы, но havent нашел что-нибудь полезное.
ОБНОВЛЕНИЕ: Я нашел возможное исправление, установив альфа = 0.0 для ячеек, которые видны, но не должны быть (позднее установка альфа = 1.0, когда анимация перехода завершена). Тем не менее, мне нужно знать, для каких ячеек это делать. Мне нужен способ доступа к странице, на которой в настоящее время включен GMGridView, поэтому я могу установить ячейки соседней страницы, чтобы иметь альфа 0.0.
ОБНОВЛЕНИЕ: Найден способ заставить его работать с помощью myGridView convertPoint: (Cgpoint, найденный методом проб и ошибок, находится в первой ячейке страницы.) FromView: myGridView.window. ПРИМЕЧАНИЕ. Мне нужно было if/else, если бы проверить, был ли я в lanscape левым или ландшафтным справа, поскольку координаты окна не вращаются, когда устройство вращается. с этим я смог получить индекс ячейки в точке на экране, который я указал, а затем установить, чтобы предыдущая страница была прозрачной, пока после анимации перехода.
Я все еще хотел бы знать, есть ли способ «обрезать» сетку, чтобы, если ячейки могли быть непрозрачными, а просто никогда не отображались ....?