4

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

在我的项目中有这些文件:

初始化视图控制器(ECSlidingController)

第一视图控制器(UIViewController)

第二视图控制器(UIViewController)

左菜单视图控制器(UIViewController)

我使用 InitView 将我的 FirstView 设置为顶视图。

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

是否可以像打开新视图一样为不断变化的顶视图设置动画?或者我怎样才能打开一个像第一个一样使用 ECSliding 的新视图?

我正在使用此代码更改顶视图:

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

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

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

5 回答 5

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];
于 2013-06-20T00:00:11.583 回答
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

于 2013-11-16T01:16:00.963 回答
0

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

[self.slidingViewController anchorTopViewOffScreenTo:...
                                          animations:...
                                          onComplete:^{
    self.slidingViewController.topViewController = second;
    [self.slidingViewController resetTopView];
}];
于 2013-05-20T21:25:24.137 回答
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 那样做,但如果你不需要做一些自定义动画,这就是你所需要的。

注意。在我的示例中,我在 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];
    }];
于 2013-08-02T10:31:34.607 回答
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
    })
于 2016-08-11T11:33:31.050 回答