2012-06-29 3 views
2

Я использую настраиваемый контроллер для переходов (не мог использовать контроллер навигации из-за присущих циклов в проекте, что позволило бы стеку навигационных контроллеров расти неограниченно [что я предполагаю, вопросы]). Я имитирую скользящую анимацию навигационных контроллеров (при переходе на новые экраны) с использованием 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 левым или ландшафтным справа, поскольку координаты окна не вращаются, когда устройство вращается. с этим я смог получить индекс ячейки в точке на экране, который я указал, а затем установить, чтобы предыдущая страница была прозрачной, пока после анимации перехода.

Я все еще хотел бы знать, есть ли способ «обрезать» сетку, чтобы, если ячейки могли быть непрозрачными, а просто никогда не отображались ....?

ответ

2

Я думаю, что я преодолел проблему. Я искал метод UIView clipsToBounds (хотя я мог бы поклясться, что раньше я это пробовал). В любом случае, его работа сейчас!