I know this is old but for anyone else who might be facing similar problems. Here is the approach I used. First I register a UINavigationControllerDelegate
to my navigation controller. The delegate needs to implement.
Objective-C
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
Swift
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool)
So the implementation would look something like this.
Objective-C
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
id<UIViewControllerTransitionCoordinator> tc = navigationController.topViewController.transitionCoordinator;
[tc notifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> context) {
NSLog(@"Is cancelled: %i", [context isCancelled]);
}];
}
Swift
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
if let coordinator = navigationController.topViewController?.transitionCoordinator() {
coordinator.notifyWhenInteractionEndsUsingBlock({ (context) in
print("Is cancelled: (context.isCancelled())")
})
}
}
The callback will fire when the user lifts her finger and the (Objec-C)[context isCancelled];
(Swift)context.isCancelled()
will return YES
/true
if the animation was reversed (the view controller was not popped), else NO
/false
. There is more stuff in the context
that can be of use, like both view controllers involved and the percentage of the animation that was completed upon release etc.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…