UIViewController 半屏“抽屉滑轨”动画

Posted

技术标签:

【中文标题】UIViewController 半屏“抽屉滑轨”动画【英文标题】:UIViewController half screen "drawer slide" animation 【发布时间】:2013-07-20 10:12:39 【问题描述】:

我试图让UIViewController 出现右侧的“幻灯片”动画。不像 Push segue,不像 Facebook 应用程序。我希望新的 ViewController 在当前 ViewController 的顶部滑动(而不是将其推开),但只覆盖屏幕的一部分,让另一部分显示第一个 ViewController。

我尝试过的:我得到的最接近的方法是使用以下内容创建自定义 segue:

- (void)perform

    __block UIViewController *src = (UIViewController *) self.sourceViewController;
    __block UIViewController *dst = (UIViewController *) self.destinationViewController;

    CATransition* transition = [CATransition animation];
    transition.duration = .50;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromRight;

    [src.navigationController.view.layer addAnimation:transition forKey:@"SwitchToView1"];
    [src.navigationController pushViewController:dst animated:NO];

这实现了我想要的动画,但它涵盖了整个第一个 ViewController。我怎样才能让它停在某个点而不是覆盖整个事情?

我正在使用 Storyboards,这是我第一次尝试任何类型的新动画。

【问题讨论】:

你好我也需要实现同样的东西,你能给我一些初步的想法,我把这段代码放在哪个类? 【参考方案1】:

您可以尝试在源视图控制器中执行此操作,并更改目标(x 轴)的框架,例如:

- (void) perform     
    UIViewController *dst = (UIViewController *) self.destinationViewController;

    [dst.view setFrame:CGRectMake(160, 0, YOUR_DST_WIDTH, YOUR_DST_HEIGHT)];

    //your animation stuff...

    [self addChildViewController:dst]; 
    [self.view addSubview:dst.view]; 
    [dst didMoveToParentViewController:self]; 

应该这样做!

如果没有,请告诉我...

更新!:

@CaptJak 嘿,很抱歉,这对你没有用。我编写了以下代码,它在这里没有任何问题。我将它链接到一个按钮点击。试试吧,让我知道! (PS:我也加了动画!)。

ViewController *tlc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainViewController"];
[tlc.view setFrame:CGRectMake(-320, 0, self.view.frame.size.width, self.view.frame.size.height)];

[self addChildViewController:tlc];
[self.view addSubview:tlc.view];
[tlc didMoveToParentViewController:self];

[UIView animateWithDuration:0.3 animations:^
    [tlc.view setFrame:CGRectMake(-160, 0, self.view.frame.size.width, self.view.frame.size.height)];
];

【讨论】:

不,不起作用。我没有以编程方式创建 dst VC,如果我放入源 VC,self.destinationViewController 将不起作用。我上面的代码来自UIStoryBoardSegue 子类(因此是源和destinationViewcontroller)。做上述也不会给我动画...... 您还有什么建议吗? 希望,你不介意我问,但是有没有办法把这个动画和演示变成一个segue?我想再次使用它,但在不同的场景中,我想通过prepareForSegue 方法传递数据。 @CaptJak 一点也不! .. 嗯,我不认为有一个简单的方法可以做到这一点.. 我知道。但如果要这样做,我会选择github.com/John-Lluch/SWRevealViewController 之类的东西,然后玩一下。它和Facebook中的一样,但我相信你可以修改它。希望你让它工作!万事如意! 我想通了,其实很简单。我会把它作为另一个答案发布【参考方案2】:

使用 Albara 给出的答案,我还能够创建具有相同动画的 segue。自定义segue如下:

- (void)perform

    UIViewController *src = (UIViewController *)self.sourceViewController;
    UIViewController *dst = (UIViewController *)self.destinationViewController;

    [dst.view setFrame:CGRectMake(380, 0, dst.view.frame.size.width, dst.view.frame.size.height)];

    [src addChildViewController:dst];
    [src.view addSubview:dst.view];
    [dst didMoveToParentViewController:src];

    [UIView animateWithDuration:0.5 animations:^
        [dst.view setFrame:CGRectMake(300, 0, src.view.frame.size.width, src.view.frame.size.height)];
    ];


只是重命名的问题,真的。

【讨论】:

先生,我将如何使用 uigesturerecongniton 删除此视图?【参考方案3】:

我刚刚创建了NDOverlayViewController 来做这样的事情。实际上,它可以使用可变偏移、范围和动画选项从任何边缘覆盖/滑动一个视图控制器。我将它创建为一个实验,但也许它会对某人有所帮助?

【讨论】:

以上是关于UIViewController 半屏“抽屉滑轨”动画的主要内容,如果未能解决你的问题,请参考以下文章

video播放视频默认全屏还是半屏

Android:2相对布局分为半屏

将宽度调整为半屏

Android 使画布覆盖半屏

跳转Google play半屏详情页

UIScrollView 和 UIView 的约束