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
, setNeedsLayout
itd.
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?