首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS 7只在某些时候使用自定义交互转换。

iOS 7只在某些时候使用自定义交互转换。
EN

Stack Overflow用户
提问于 2013-11-21 06:07:33
回答 5查看 10.8K关注 0票数 14

所以我有一个UINavigationController,控制器A作为根控制器。

当我想将Controller推到顶部时,我希望使用自定义动画转换和自定义交互转换。这个很好用。

当我想将Controller推到顶部时,我想回到默认的 push/pop转换,即UINavigationController附带的转换。为了实现这一目标,我返回零

代码语言:javascript
运行
复制
navigationController:animationControllerForOperation:fromViewController:toViewController:

然而,如果你返回零,那么

代码语言:javascript
运行
复制
navigationController:interactionControllerForAnimationController:

永远不会被调用,默认的“从左边边缘开始”的弹出交互转换不起作用。

是否有方法返回默认的push/pop动画控制器和交互控制器?(是否有id<UIViewControllerAnimatedTransitioning>id<UIViewControllerInteractiveTransitioning>的具体实现?)

还是其他方式?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-01-04 16:22:36

应该将NavigationController的interactivePopGestureRecognizer委托设置为self,然后在-gestureRecognizerShouldBegin中处理其行为:

也就是说,当您希望内置的pop手势启动时,您必须从此方法返回YES。这同样适用于您的自定义手势--您必须弄清楚您正在处理的是哪个识别器。

代码语言:javascript
运行
复制
- (void)setup
{
    self.interactiveGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleTransitionGesture:)];
    self.interactiveGestureRecognizer.delegate = self;
    [self.navigationController.view addGestureRecognizer:self.interactiveGestureRecognizer];

    self.navigationController.interactivePopGestureRecognizer.delegate = self;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // Don't handle gestures if navigation controller is still animating a transition
    if ([self.navigationController.transitionCoordinator isAnimated])
        return NO;

    if (self.navigationController.viewControllers.count < 2)
        return NO;

    UIViewController *fromVC = self.navigationController.viewControllers[self.navigationController.viewControllers.count-1];
    UIViewController *toVC = self.navigationController.viewControllers[self.navigationController.viewControllers.count-2];

    if ([fromVC isKindOfClass:[ViewControllerB class]] && [toVC isKindOfClass:[ViewControllerA class]])
    {
        if (gestureRecognizer == self.interactiveGestureRecognizer)
            return YES;
    }
    else if (gestureRecognizer == self.navigationController.interactivePopGestureRecognizer)
    {
        return YES;
    }

    return NO;
}

您可以查看您的场景的样本工程。视图控制器A和B之间的转换是自定义动画,自定义B->A弹出手势。视图控制器B和C之间的转换是默认的,内置导航控制器的pop手势。

希望这能有所帮助!

票数 19
EN

Stack Overflow用户

发布于 2014-01-14 03:03:04

在出现之前,每次都需要设置委托--例如,在prepareForSeque中。如果您想要自定义转换,请将其设置为self。如果您想要默认的转换(如默认的pop转换),则将其设置为零。

票数 15
EN

Stack Overflow用户

发布于 2015-04-02 11:40:58

在每个转换之前/之后设置委托是一个有效的解决办法,但如果您实现了其他UINavigationControllerDelegate的方法,并且需要保留它们,您可以按照Ziconic的建议拥有2个委托对象,也可以使用NSObject的respondsToSelector:。在导航委托中,您可以实现:

代码语言:javascript
运行
复制
- (BOOL)respondsToSelector:(SEL)aSelector
{
    if (aSelector == @selector(navigationController:animationControllerForOperation:fromViewController:toViewController:) ||
        aSelector == @selector(navigationController:interactionControllerForAnimationController:)) {

        return self.interactivePushTransitionEnabled;
    }

    return [super respondsToSelector:aSelector];
}

然后,您应该确保根据需要更新interactivePushTransitionEnabled。在您的示例中,只有在显示控制器A时,才应该将属性设置为YES

还有一件事要做:强制UINavigationController重新评估其委托实现的方法。这样做是很容易做到的:

代码语言:javascript
运行
复制
navigationController.delegate = nil;
navigationController.delegate = self; // or whatever object you use as the delegate
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20113701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档