2015-07-08 6 views
1

У меня есть NSPopover, который переключается между двумя контроллерами View.Анимация Изменения в содержимом NSPopoverViewController

Я поставил один на старте,

self.popover.contentViewController = viewController1; 

и меняю на другой на основе действий пользователя:

self.popover.contentViewController = viewController2; 

AppKit делает некоторые анимации в самой NSPopover для размещения второго VC , которые работают хорошо, но переход между двумя представлениями View Controller вызывает раздражение. Я бы хотел, чтобы они скользили и выходили горизонтально или, по крайней мере, пересекались.

Я использую взгляды слоев спинок, которые я устанавливаю, как это в AppDelegate «s applicationDidFinishLaunching метода:

self.popover.contentViewController.view.wantsLayer = YES; 
self.popover.contentViewController.view.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay; 

Вот что я пробовал:

  • выведение сначала просмотрите вид контроллера в -viewWillDisappear и затухайте во втором представлении View Controller в -viewWillAppear. Это угасает первый взгляд VC сразу и не выгорает вид второго VC назад в
  • выведении слой первый взгляд в ВК Перед включением поповер-х contentViewController:

    CALayer *theLayer = self.popover.contentViewController.view.layer; 
    
    CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    fadeAnim.fromValue = [NSNumber numberWithFloat:1.0]; 
    fadeAnim.toValue = [NSNumber numberWithFloat:0.0]; 
    fadeAnim.duration = 1.0; 
    [theLayer addAnimation:fadeAnim forKey:@"opacity"]; 
    
    theLayer.opacity = 0.0; 
    
    self.popover.contentViewController = self.viewController; 
    

Эта вторая стратегия Безразлично» t дождаться завершения анимации до переключения контроллеров просмотра.

Как мне изменить Netsopover contentViewController?

ответ

-1

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

toController.view.frame = fromController.view.bounds;       
[containerViewController addChildViewController:toController];          
[fromController willMoveToParentViewController:nil]; 

[containerViewController transitionFromViewController:fromViewController 
            toViewController:toViewController 
              duration:0.2 
               options:UIViewAnimationOptionTransitionCrossDissolve 
              animations:nil 
              completion:^(BOOL finished) { 
               [fromViewController removeFromParentViewController]; 
               [toViewController didMoveToParentViewController:containerViewController]; 
               toViewController.view.frame = containerViewController.view.bounds; 
              }]; 

Где containerViewController - это ваш контент-контроль.

Довольно просто скажите, что старый контроллер просмотра он удаляется из родителя, анимирует переход и удаляет старый контроллер и позволяет новому контроллеру знать, что он был перенесен в родительский.

Подробнее яблочная здесь: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

и хороший учебник по пользовательских переходов здесь: http://www.objc.io/issues/12-animations/custom-container-view-controller-transitions/

+0

Спасибо, Макс. Этот вопрос касается Cocoa (Mac), а не Cocoa touch (iOS), поэтому, хотя методы похожи, они не совпадают. В итоге я использовал эквивалент метода, который вы предложили. – magiclantern

+0

Я также должен отметить, что я не мог сделать это непосредственно с помощью 'contentViewController 'от NSPopover, мне пришлось добавить пустой пустой контроллер View, чтобы действовать как« родительский »из моих двух VC и назначить« contentViewController »NSPopover этому родительскому View Controller , – magiclantern