Górny przewodnik układu nawigacyjnego nie jest honorowany z niestandardowym przejściem

Krótka wersja:

Mam problem z automatycznym układem górnego przewodnika po użyciu w połączeniu z niestandardowym przejściem iUINavigationController w iOS7. W szczególności ograniczenie między górnym przewodnikiem układu a widokiem tekstu nie jest honorowane. Czy ktoś napotkał ten problem?

Długa wersja:

Mam scenę, która jednoznacznie definiuje ograniczenia (tj. Górną, dolną, lewą i prawą), która wyświetla widok w taki sposób:

Ale kiedy używam tego z niestandardowym przejściem w kontrolerze nawigacyjnym, górne ograniczenie do górnego przewodnika układu wydaje się być wyłączone i renderuje się w następujący sposób, tak jakby górny przewodnik układu był na górze ekranu, a nie na dole kontrolera nawigacji:

Wygląda na to, że „przewodnik po topowym układzie” w kontrolerze nawigacyjnym staje się mylący przy stosowaniu przejścia niestandardowego. Reszta ograniczeń jest stosowana poprawnie. A jeśli obrócę urządzenie i obrócę je ponownie, wszystko zostanie nagle poprawnie wyrenderowane, więc nie wydaje się, aby nie było to, że ograniczenia nie są właściwie zdefiniowane. Podobnie, po wyłączeniu niestandardowego przejścia widoki są renderowane poprawnie.

Powiedziawszy to,_autolayoutTrace zgłasza, żeUILayoutGuide obiekty cierpiąAMBIGUOUS LAYOUT, kiedy biegnę:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]

Ale te przewodniki po układach są zawsze zgłaszane jako niejednoznaczne, gdy tylko na nie patrzę, mimo że upewniłem się, że nie brakuje brakujących ograniczeń (zrobiłem zwyczajowe wybieranie kontrolera widoku i wybranie „Dodaj brakujące ograniczenia dla kontrolera widoku” lub wybranie wszystkich kontroli i robi to samo dla nich).

Pod względem tego, jak dokładnie wykonuję przejście, określiłem obiekt, który jest zgodnyUIViewControllerAnimatedTransitioning wanimationControllerForOperation metoda:

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

    return nil;
}

I

@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

Wykonałem także tłumaczenie powyższego, ustawiającframe widoku, a nietransform, z tym samym rezultatem.

Próbowałem również ręcznie, aby upewnić się, że ograniczenia są ponownie stosowane przez wywołanielayoutIfNeeded. Próbowałem teżsetNeedsUpdateConstraints, setNeedsLayoutitd.

Ostatecznie, czy ktoś z powodzeniem ożenił się z niestandardowym przejściem kontrolera nawigacyjnego z ograniczeniami, które korzystają z przewodnika górnego układu?

questionAnswers(12)

yourAnswerToTheQuestion