Apple automatische Umsetzung der „Swipe rechts VC Pop“ funktioniert nur, für die linken ~ 20 Punkte des Bildschirms. Auf diese Weise stellen sie sicher, dass sie sich nicht mit den Funktionen Ihrer App herumschlagen. Stellen Sie sich vor, Sie haben einen UIScrollView
auf dem Bildschirm, und Sie können nicht nach rechts wischen, weil VCs immer wieder herauskommen. Das wäre nicht nett.
Apple sagt here:
interactivePopGestureRecognizer
Die Gestenerkenner verantwortlich für die Top-View-Controller aus dem Navigationsstapel knallen. (Nur-Lese)
@property (nonatomic, nur lesbar) UIGestureRecognizer * interactivePopGestureRecognizer
Der Navigationsregler installiert diesen Gestenerkenner auf seiner Ansicht und verwendet sie die oberste Ansicht Regler aus dem Navigationsstapel Pop. Sie können diese Eigenschaft verwenden, um den Gestenerkenner abzurufen und ihn an das Verhalten anderer Gestenerkenner in Ihrer Benutzerschnittstelle zu binden. Wenn Sie Ihre Gestenerkenner zusammenbinden, stellen Sie sicher, dass sie ihre Gesten gleichzeitig erkennen, um sicherzustellen, dass Ihre Gestenerkenner eine Chance erhalten, das Ereignis zu behandeln.
So haben Sie Ihre eigenen UIGestureRecognizer
, implementieren und ihr Verhalten auf die interactivePopGestureRecognizer
Ihre UIViewController
binden.
Edit:
Hier ist eine Lösung, die ich gebaut. Sie können Ihren eigenen Übergang implementieren, der dem Delegaten UIViewControllerAnimatedTransitioning
entspricht. Diese Lösung funktioniert, wurde aber nicht gründlich getestet.
Sie einen interaktiven gleitenden Übergang erhalten Sie Ihre Viewcontrollers Pop. Sie können von überall in der Ansicht nach rechts rutschen.
Bekanntes Problem: Wenn Sie den Schwenk starten und vor der halben Breite der Ansicht anhalten, wird der Übergang abgebrochen (erwartetes Verhalten). Während dieses Vorgangs werden die Ansichten auf ihre ursprünglichen Frames zurückgesetzt. Sie sind ein visueller Fehler während dieser Animation.
Die Klassen des Beispiels sind die folgenden:
UINavigationController> Viewcontroller> SecondViewController
CustomPopTransition.h:
#import <Foundation/Foundation.h>
@interface CustomPopTransition : NSObject <UIViewControllerAnimatedTransitioning>
@end
CustomPopTransition.m:
#import "CustomPopTransition.h"
#import "SecondViewController.h"
#import "ViewController.h"
@implementation CustomPopTransition
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
return 0.3;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
SecondViewController *fromViewController = (SecondViewController*)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
ViewController *toViewController = (ViewController*)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *containerView = [transitionContext containerView];
[containerView addSubview:toViewController.view];
[containerView bringSubviewToFront:fromViewController.view];
// Setup the initial view states
toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController];
[UIView animateWithDuration:0.3 animations:^{
fromViewController.view.frame = CGRectMake(toViewController.view.frame.size.width, fromViewController.view.frame.origin.y, fromViewController.view.frame.size.width, fromViewController.view.frame.size.height);
} completion:^(BOOL finished) {
// Declare that we've finished
[transitionContext completeTransition:!transitionContext.transitionWasCancelled];
}];
}
@end
SecondViewController.h:
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController <UINavigationControllerDelegate>
@end
SecondViewController.m:
#import "SecondViewController.h"
#import "ViewController.h"
#import "CustomPopTransition.h"
@interface SecondViewController()
@property (nonatomic, strong) UIPercentDrivenInteractiveTransition *interactivePopTransition;
@end
@implementation SecondViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationController.delegate = self;
UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePopRecognizer:)];
[self.view addGestureRecognizer:popRecognizer];
}
-(void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
// Stop being the navigation controller's delegate
if (self.navigationController.delegate == self) {
self.navigationController.delegate = nil;
}
}
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC {
// Check if we're transitioning from this view controller to a DSLSecondViewController
if (fromVC == self && [toVC isKindOfClass:[ViewController class]]) {
return [[CustomPopTransition alloc] init];
}
else {
return nil;
}
}
- (id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController {
// Check if this is for our custom transition
if ([animationController isKindOfClass:[CustomPopTransition class]]) {
return self.interactivePopTransition;
}
else {
return nil;
}
}
- (void)handlePopRecognizer:(UIPanGestureRecognizer*)recognizer {
// Calculate how far the user has dragged across the view
CGFloat progress = [recognizer translationInView:self.view].x/(self.view.bounds.size.width * 1.0);
progress = MIN(1.0, MAX(0.0, progress));
if (recognizer.state == UIGestureRecognizerStateBegan) {
NSLog(@"began");
// Create a interactive transition and pop the view controller
self.interactivePopTransition = [[UIPercentDrivenInteractiveTransition alloc] init];
[self.navigationController popViewControllerAnimated:YES];
}
else if (recognizer.state == UIGestureRecognizerStateChanged) {
NSLog(@"changed");
// Update the interactive transition's progress
[self.interactivePopTransition updateInteractiveTransition:progress];
}
else if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled) {
NSLog(@"ended/cancelled");
// Finish or cancel the interactive transition
if (progress > 0.5) {
[self.interactivePopTransition finishInteractiveTransition];
}
else {
[self.interactivePopTransition cancelInteractiveTransition];
}
self.interactivePopTransition = nil;
}
}
@end
Sie diese Frage folgen (es hat noch keine Antworten, aber es ist ein Duplikat): http://stackoverflow.com/questions/20714595/extend-default-interactivepopgesture_recognizer-beyond-screen-edge – rdurand
Die perfekte Lösung mit Code und Erklärung: - http: //stackoverflow.com/a/32990248/98 8169 – pkc456