ECSlidingViewController与topview动画有关的问题

时间:2013-05-20 21:15:15

标签: ios animation uiviewcontroller ecslidingviewcontroller

我正在使用ECSliding,我遇到了这个问题!

在我的项目中有以下文件:

  

InitViewController(ECSlidingController)

     

FirstViewController(UIViewController)

     

SecondViewController(UIViewController)

     

LeftMenuViewController(UIViewController)

我使用InitView将我的FirstView作为topview进行实例化。

在我的FirstView中有一个按钮,按下时将SecondView设置为topview。

是否可以为更改的顶视图设置动画,就像我正在打开一个新视图一样? 或者我如何打开像第一个一样使用ECSliding的新视图?

我正在使用此代码更改topview:

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

我想要的动画可以是默认动画,例如:

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

5 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

可能你最好的选择是使用滑动视图控制器的动画方法。在屏幕顶部视图中设置动画,在完成模块中更改顶视图控制器(至第二个),然后启动新动画以将顶视图设置为屏幕上的动画。

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

答案 2 :(得分: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。在我的例子中,我在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];
    }];

答案 3 :(得分: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

答案 4 :(得分:0)

@ Michael-Enriquez的答案转换为swift。

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
    })