2013-05-20 3 views
4

Я использую ECSliding, и у меня есть эта проблема!Проблемы с ECSlidingViewController с анимацией topview

В моем проекте есть эти файлы:

InitViewController (ECSlidingController)

FirstViewController (UIViewController)

SecondViewController (UIViewController)

LeftMenuViewController (UIViewController)

Я использую InitView для instatiate мой FirstView как TopView.

В моем FirstView есть кнопка, когда нажимается на SetView как вид сверху.

Возможно ли оживить меняющийся вид сверху, как будто я открываю новый вид? или как открыть новый вид, который использует ECSliding, как первый?

Я использую этот код, чтобы изменить Topview:

self.slidingViewController.topViewController = second; 
[self.slidingViewController resetTopView]; 

Анимация, что я хочу, может быть просто по умолчанию один, как:

[self presentViewController:(*UIViewController) animated:YES completion:nil]; 

ответ

0

Возможно, лучшим вариантом будет использовать анимационные методы контроллера спуска. Анимируйте верхний вид с экрана, в блоке завершения измените контроллер верхнего уровня (на второй), затем запустите новую анимацию, чтобы оживить верхний вид назад на экран.

[self.slidingViewController anchorTopViewOffScreenTo:... 
              animations:... 
              onComplete:^{ 
    self.slidingViewController.topViewController = second; 
    [self.slidingViewController resetTopView]; 
}]; 
+0

Как я могу это сделать? Можете ли вы мягко написать какой-то общий код, чтобы помочь мне понять? – Tortuga

+0

Я пробовал, но ничего! Вид исчезает и остается моим левым или правым меню в зависимости от того, какой я использовал (ECSide). Могли бы вы быть такими нежными, чтобы написать конкретный код для моего дела? Я бы очень признателен! – Tortuga

+0

Я уже делал, как вы написали, и «Вид исчезает и остается моим левым или правым меню в зависимости от того, какой я использовал (ECSide)». я добавил: '[self.slidingViewController anchorTopViewOffScreenTo: ... анимации: ... OnComplete:^{ self.slidingViewController.topViewController = второй; [self.slidingViewController resetTopView]; }]; [self.slidingViewController anchorTopViewTo: ... анимации: nil onComplete: nil]; ' – Tortuga

3

Подкласс ECSlidingViewController. Я называю мой подкласс DeckController:

В DeckController.h:

- (void)setTopViewController:(UIViewController *)topViewController withTransition:(CATransition*)transition; 

В DeckController.m:

- (void)setTopViewController:(UIViewController *)topViewController withTransition:(CATransition*)transition { 

    self.topViewController = topViewController; 
    [UIView animateWithDuration:0.25f animations:^() { 
     [[self.view layer] addAnimation:transition forKey:@"topViewTransition"]; 
    }]; 
} 

Затем в контроллере представления, который хочет перейти на новый вид сверху, сделать что-то вроде этого:

CATransition *animation = [CATransition animation]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:kCATransitionFromRight]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[animation setFillMode:kCAFillModeBoth]; 
[animation setDuration:.25]; 

DeckController *deck = (DeckController*)self.slidingViewController; 
[deck setTopViewController:newTopViewController withTransition:animation]; 
+0

это хорошо работает для меня – Macistador

0

Я использую такую ​​же операцию, как если бы я нажал на элемент меню в мое левое меню.

[self.anchorTopViewOffScreenTo:ECRight animations:nil onComplete:^{ 
     CGRect frame = self.topViewController.view.frame; 
     self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondVC"]; 
     self.topViewController.view.frame = frame; 
     [self resetTopView]; 
    }]; 

Просто обобщайте это, и вы можете называть его повсюду. Он сам делает анимацию. Вы можете делать как @Alex, но если вам не нужно делать какую-то пользовательскую анимацию, это все, что вам нужно.

NB.в моем примере Im, использующем это в initViewController (для которого является ECSlidingViewController, поэтому я отправляю self), заставляя пользователя на определенный viewController. Если вам необходимо изменить вид в любом subViewControllers вы просто посылая к self.slidingViewController как на примере ниже:

[self.slidingViewController anchorTopViewOffScreenTo:ECRight animations:nil onComplete:^{ 
     CGRect frame = self.slidingViewController.topViewController.view.frame; 
     self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondVC"]; 
     self.slidingViewController.topViewController.view.frame = frame; 
     [self.slidingViewController resetTopView]; 
    }]; 
0

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

SecondTopViewController *secondTopViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondTop"]; 
secondTopViewController.view.frame = self.slidingViewController.view.bounds; 
secondTopViewController.view.alpha = 0; 

// temporarily add the second top view so that we can animate it in. 
[self.slidingViewController.view addSubview:secondTopViewController.view]; 

[UIView animateWithDuration:0.5 animations:^{ 
    secondTopViewController.view.alpha = 1; 
} completion:^(BOOL finished) { 
    // remove the second top view. 
    [secondTopViewController.view removeFromSuperview]; 

    // let sliding view controlller take over from here 
    self.slidingViewController.topViewController = secondTopViewController; 
}]; 

Смотрите мой рабочий пример здесь: https://github.com/enriquez/ECSlidingViewController/tree/so-16658539

0

@ ответ Michael-Энрикес преобразованный в стриж.

let viewController = (self.storyboard?.instantiateViewControllerWithIdentifier("ViewController"))! as? ViewController 
    let navController = UINavigationController(rootViewController: viewController!) 
    navController.view.frame = self.slidingViewController().view.bounds 
    navController.view.alpha = 0 
    self.slidingViewController().view.addSubview(navController.view) 
    UIView.animateWithDuration(0.25, animations: { 
     navController.view.alpha = 1 
     }, completion: {(finished:Bool) -> Void in 
      navController.view.removeFromSuperview() 
      self.slidingViewController().topViewController = navController 
    })