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 LAYOUT
Wenn 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 dertransform
mit 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?