Die obere Layout-Anleitung des Navigationscontrollers wird bei benutzerdefinierten Übergängen nicht berücksichtigt

Kurzfassung:

Ich habe ein Problem mit der oberen Layouthilfe für das automatische Layout, wenn sie in Verbindung mit benutzerdefinierten Übergängen und verwendet wirdUINavigationController in iOS7. Insbesondere wird die Einschränkung zwischen dem oberen Layoutleitfaden und der Textansicht nicht beachtet. Hat jemand dieses Problem festgestellt?

Lange Version:

Ich habe eine Szene, die Bedingungen eindeutig definiert (d. H. Oben, unten, links und rechts), die eine Ansicht wie folgt darstellt:

Wenn ich dies jedoch mit einem benutzerdefinierten Übergang auf dem Navigations-Controller verwende, ist die obere Einschränkung für die obere Layout-Anleitung deaktiviert und es wird wie folgt gerendert, als befände sich die obere Layout-Anleitung am oberen Bildschirmrand und nicht am unteren Bildschirmrand des Navigationscontrollers:

Es scheint, dass die "Top-Layout-Anleitung" mit dem Navigations-Controller beim Verwenden des benutzerdefinierten Übergangs verwirrt wird. Die restlichen Einschränkungen werden korrekt angewendet. Und wenn ich das Gerät drehe und erneut drehe, wird plötzlich alles richtig gerendert, sodass es nicht so aussieht, als ob die Einschränkungen nicht richtig definiert sind. Wenn ich meinen benutzerdefinierten Übergang deaktiviere, werden die Ansichten ebenfalls korrekt gerendert.

Nachdem ich das gesagt habe,_autolayoutTrace berichtet, dass dieUILayoutGuide Objekte leiden unterAMBIGUOUS LAYOUTWenn ich renne:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]

Diese Layout-Anleitungen werden jedoch immer als mehrdeutig gemeldet, wenn ich sie ansehe, obwohl sichergestellt ist, dass keine Einschränkungen fehlen (ich habe den Ansichts-Controller wie gewohnt ausgewählt und "Fehlende Einschränkungen für Ansichts-Controller hinzufügen" ausgewählt oder alle ausgewählt) der Kontrollen und das gleiche für sie zu tun).

In Bezug darauf, wie genau ich den Übergang durchführe, habe ich ein Objekt angegeben, das konform istUIViewControllerAnimatedTransitioning in demanimationControllerForOperation Methode:

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                  animationControllerForOperation:(UINavigationControllerOperation)operation
                                               fromViewController:(UIViewController*)fromVC
                                                 toViewController:(UIViewController*)toVC
{
    if (operation == UINavigationControllerOperationPush)
        return [[PushAnimator alloc] init];

    return nil;
}

Und

@implementation PushAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
    return 0.5;
}

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController* toViewController   = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [[transitionContext containerView] addSubview:toViewController.view];
    CGFloat width = fromViewController.view.frame.size.width;

    toViewController.view.transform = CGAffineTransformMakeTranslation(width, 0);

    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
        fromViewController.view.transform = CGAffineTransformMakeTranslation(-width / 2.0, 0);
        toViewController.view.transform = CGAffineTransformIdentity;
    } completion:^(BOOL finished) {
        fromViewController.view.transform = CGAffineTransformIdentity;
        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
    }];
}

@end

Ich habe auch eine Wiedergabe der obigen Einstellungen gemachtframe eher von der Ansicht als von dertransformmit dem gleichen Ergebnis.

Ich habe auch versucht, manuell sicherzustellen, dass die Einschränkungen durch Aufrufen erneut angewendet werdenlayoutIfNeeded. Ich habe es auch versuchtsetNeedsUpdateConstraints, setNeedsLayout, usw.

Fazit: Hat jemand erfolgreich einen benutzerdefinierten Übergang des Navigationscontrollers mit Einschränkungen geheiratet, die die obere Layoutanleitung verwenden?

Antworten auf die Frage(12)

Ihre Antwort auf die Frage