【问题标题】:How to use pushViewController in interaction transition with panGestureRecoginizer如何在与 panGestureRecoginizer 的交互过渡中使用 pushViewController
【发布时间】:2015-02-26 00:02:08
【问题描述】:

我尝试实现一个使用 Pan Gesture 的简单交互过渡。它看起来像在这个video.
我有使用情节提要的示例项目。该项目位于此link
但是,如果我将 ViewController 的第 50 行中的“performSegueWithIdentifier ...”替换为第 51 行中注释掉的“pushViewController:controller”。平移手势立即被取消.调用“performSegueWithIdentifier”和“pushViewController:controller”有什么区别。他们基本上只是推送到另一个视图控制器。有什么建议我可以使用 pushViewController 方法调用而不是调用 performSegueWithIdentifier 吗?任何见解将不胜感激。

switch (panGuesture.state)
{
    case UIGestureRecognizerStateBegan:
        NSLog(@"======================UIGestureRecognizerStateBegan");
        [self performSegueWithIdentifier:@"pushNP" sender:panGuesture]; //line 50
        [self.navigationController pushViewController:controller animated:YES]; //line 51
        break;
    case UIGestureRecognizerStateChanged:
        NSLog(@"======================UIGestureRecognizerStateChanged");
        float percentageOfPan = [self percentageOfPan:touchLocation];
        NSLog(@"=======percentageOfPan:%f",percentageOfPan);
        [self.transition updateInteractiveTransition:percentageOfPan];
        break;
    case UIGestureRecognizerStateCancelled:
        NSLog(@"======================UIGestureRecognizerStateCancelled");
        break;
    case UIGestureRecognizerStateEnded:
        NSLog(@"======================UIGestureRecognizerStateEnded");
        if(touchLocation.y < 600){
            [self.transition finishInteractiveTransition];
        } else {
            [self.transition cancelInteractiveTransition];
        }
        break;
    default:
        break;
}

【问题讨论】:

    标签: ios transition interactive


    【解决方案1】:

    这两种不同的方法是实例化两个不同的视图控制器。 segue 实例化了您在情节提要中拥有的 NPViewController 的实例,而当您执行推送时,您正在推送您分配初始化的普通 UIViewController。

    平移手势识别器处理程序的前几行应如下所示,

    - (void)pan:(UIPanGestureRecognizer*)panGuesture{
        CGPoint touchLocation = [panGuesture locationInView:self.view];
        NSLog(@"==========pan touch location:%f,%f",touchLocation.x,touchLocation.y);
        //UIViewController *controller = [[UIViewController alloc]init];
        NPViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"NPViewController"];
        controller.view.backgroundColor = [UIColor whiteColor];
        switch (panGuesture.state)
        {
            case UIGestureRecognizerStateBegan:
                NSLog(@"======================UIGestureRecognizerStateBegan");
               // [self performSegueWithIdentifier:@"pushNP" sender:panGuesture];
                [self.navigationController pushViewController:controller animated:YES];
                break;
    

    我已经注释掉了用于实例化 UIViewController 的行。确保在情节提要中为 NPViewController 添加标识符。

    【讨论】:

    • 您好,rdelmar,感谢您的回复。当我根据您的建议更改代码时,它确实有效。但是如果我想在不使用情节提要的情况下创建自己的 uiviewcontroller 怎么办。我不能像在项目中那样创建 UIViewController 吗?
    • @TsungLinTsai,我不确定。我仍在试图弄清楚为什么它不像你最初写的那样工作。我认为您仍然应该获得百分比驱动的转换,但只是转到与您在情节提要中制作的视图控制器不同的视图控制器。
    • @rdelmar 感谢您对此进行调查。我在 stackoverflow 和 github 上搜索了有关交互式转换的所有内容,但似乎找不到使用 pushViewController 方法的工作示例。 PopViewControllerAnimated 似乎工作得很好。
    • @TsungLinTsai,问题出在您的 animationControllerForOperation... 方法中,您有一个 if 子句,如果 toVC 是 NPViewController,则该子句仅返回动画器。将其更改为 if ( ! [toVC isKindOfClass:[ViewController class]]),它应该可以正常工作。这应该使它适用于正向的任何视图控制器类,但在弹出时没有自定义转换。
    • @rdelmar。解决了这个问题。非常感谢你。我还在github上创建了一个resolved_issue分支来演示代码,以防有人遇到类似问题。
    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2015-10-02
    • 2016-03-12
    • 1970-01-01
    • 2016-06-01
    • 2019-04-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多