我有一个自定义控件,包含一行按钮,模仿标签栏。当UINavigationController
导航离开根视图控制器时,此控件将滑出视图,并在导航到根目录时滑回。
使用iOS 7时,UIScreenEdgePanGestureRecognizer
会提供向后滑动的手势。因此,我正在修改自定义控件,以便幻灯片数量与UIScreenEdgePanGestureRecognizer
的翻译相对应。
问题是,当用户释放触摸时,如何判断UINavigationController
是否会导航或弹回原始视图?
[self.interactivePopGestureRecognizer addTarget:self action:@selector(panningBack:)];
- (void) panningBack:(UIPanGestureRecognizer *)recognizer
{
// Snipped - Code that reads the recognizer translation and adjust custom control y position
if (recognizer.state == UIGestureRecognizerStateEnded)
{
// Question: Does it go back, or does it not?
// If it goes back, slide custom control into view
// Else slide custom control out of view
}
}
答案 0 :(得分:5)
我知道这是一个相当古老的问题所以答案可能不会对OP有用,但可能对其他人有用。我昨天遇到了同样的问题,并在没有真正找到任何东西的情况下对SO进行了大量搜索。 所以这是我用于类似问题的解决方案。这是在navigationcontroller委托中实现的,但我想如果能够更好地满足您的需求,您可以在其他地方实现。
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
id<UIViewControllerTransitionCoordinator> tc = navigationController.topViewController.transitionCoordinator;
[tc notifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> context) {
NSLog(@"DONE!!!");
NSLog(@"Container View: %@", [context containerView]);
NSLog(@"From VC: %@", [context viewControllerForKey:UITransitionContextFromViewControllerKey]);
NSLog(@"To VC: %@", [context viewControllerForKey:UITransitionContextToViewControllerKey]);
NSLog(@"Initially Interactive: %i", [context initiallyInteractive]);
NSLog(@"Completion Curve: %d", [context completionCurve]);
NSLog(@"Is Animated: %i", [context isAnimated]);
NSLog(@"Is Cancelled: %i", [context isCancelled]);
NSLog(@"Is Interactive: %i", [context isInteractive]);
NSLog(@"Percent Complete: %f", [context percentComplete]);
NSLog(@"Presentation Style: %d", [context presentationStyle]);
NSLog(@"Transition Duration: %f", [context transitionDuration]);
}];
}
当用户抬起手指并且动画相反或完成时,这将触发。 [context isCancelled];
将告诉您它是否反转或完成。在上下文对象中还有很多其他可以使用的好信息。
答案 1 :(得分:1)
我想说最简单的解决方案是使用导航控制器中实现的默认手势。当视图出现时显示条形并在条形消失时隐藏它。
一个优雅的解决方案,用于了解它是否应该返回,将是检测最后一个动作。
意思是如果用户向左移动一些像素并释放 - &gt;反弹 如果用户向右移动一些像素并释放 - &gt;显示以前的控制器
如果您将位置保存在已更改的状态并将其与状态结束进行比较,则可以执行此操作。
明白这一点:
CGPoint point = [识别器locationInView:view];