Sha*_*oop 2 uinavigationcontroller uigesturerecognizer ios ios7
iOS 7有一个很棒的交互式动画,用于弹出UIViewControllers.通过从屏幕左侧滑动触发转换,但我想通过在视图控制器中的任意位置滑动来触发转换.(我也想从边缘取消那些,所以我可以将它们用于另一个自定义转换...).
到目前为止,在我的视图控制器中我添加了这个init.我知道这是错的,我不确定我在做什么.
UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
panRecognizer.delegate = self.navigationController.interactivePopGestureRecognizer.delegate;
[self.view addGestureRecognizer:panRecognizer];
Run Code Online (Sandbox Code Playgroud)
如何将其与内置的interactivePopGestureRecognizer绑定?应该用我的handleGesture:方法吗?
编辑:在Apple的文档中,实际使用了tie这个词:
interactivePopGestureRecognizer
导航控制器在其视图上安装此手势识别器,并使用它将最顶层的视图控制器弹出导航堆栈.您可以使用此属性检索手势识别器,并将其与用户界面中其他手势识别器的行为联系起来.将手势识别器绑在一起时,请确保他们同时识别手势,以确保您的手势识别器有机会处理事件.
你如何与UIGestureRecognizers结合在一起?
interactivePopGestureRecognizer这个案子毫无价值手势识别器有两个通知通道,代表和目标/操作.该委托用于"我是否应该考虑接受此手势",并且这个内部检查如下:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return !self.isAnimating &&
self.viewControllers.count > 1 &&
!self.navigationBarHidden &&
[self _doesTheNavigationControllerDelegateHaveCustomTransitions] &&
[self _someOtherSecretJunk];
}
Run Code Online (Sandbox Code Playgroud)
如果测试通过,则它会调用实际设置的目标/动作并激活交互式转换.
获得内置弹出交互的唯一方法是interactivePopGestureRecognizer传递其委托测试并调用操作.如果知道目标/操作是什么,我们可以尝试将其挂钩到您的自定义手势,如下所示:
[[UIPanGestureRecognizer alloc]
initWithTarget:self.navigationController._secretGestureRecognizerTarget
action:@selector(_secretGestureRecognizerAction:)];
Run Code Online (Sandbox Code Playgroud)
但即便如此,Apple也可以进行无证检查:
- (void)_secretGestureRecognizerAction:(id)sender
{
NSParameterAssert(sender == self.navigationController.interactiveGestureRecognizer);
...
}
Run Code Online (Sandbox Code Playgroud)
你可以做的比你希望的要复杂得多,但潜力更大.您需要创建自己的交互式过渡并将其附加到您自己的手势识别器.
您将要阅读教程并查看有关该主题的示例代码,但基本步骤如下:
animateTransition:以与默认转换(或您自己的设计)的外观匹配的方式实现.重要的是要注意,一旦你添加自己的自定义过渡,interactivePopGestureRecognizer有效死亡和标准交互停止工作,所以你需要在任何地方做自定义的东西.
| 归档时间: |
|
| 查看次数: |
2737 次 |
| 最近记录: |