6

Sto costruendo un'app iOS 8 e utilizzando UIPresentationController per presentare un controller di visualizzazione in modo personalizzato. (vedi la mia domanda precedente su questo qui: Replicating the style of the iOS Mail App's Compose Function).Barra di navigazione che salta quando si presenta il controller di visualizzazione tramite sottoclasse UIPresentationController

Il problema che sto avendo è che quando presento il controller, la barra di navigazione inizia con 64 punti di altezza e poi salta/si riduce a 44 una volta che la presentazione è finita. La mia ipotesi è che il controller della vista si accorga che non sta coprendo la barra di stato e quindi si restringe una volta giunta alla sua posizione finale di riposo. Mi piacerebbe che la barra di navigazione fosse alta 44 punti per tutto il tempo e non saltasse/restringesse.

L'immagine seguente mostra l'aspetto del controller di visualizzazione alla fine della presentazione. È anche ciò che voglio che assomigli tutto il tempo. Qualche idea su come mantenere la barra di navigazione su 44 punti per tutto il tempo?

enter image description here

UPDATE (2015/03/24):

ho fatto riferimento a un post sul blog da un po 'indietro per trovare qualche informazione in più su questo tema. Fondamentalmente, UINavigationController disegna la sua barra di navigazione di 64 o 44 punti di altezza a seconda che il frame della sua vista sia abbinato alla finestra dell'app o meno. Quindi ho bisogno di un modo per dire al controller di navigazione che la sua posizione finale di riposo non sarà allineata con la finestra e che la barra di navigazione dovrebbe essere disegnata a 44 punti di altezza.

http://blog.jaredsinclair.com/post/61507315630/wrestling-with-status-bars-and-navigation-bars-on

risposta

1

Ho riscontrato un problema simile al tuo, in cui la barra di spostamento si ridimensiona dopo che è stato chiamato il numero [transitionContext completeTransition:YES], in base alla contiguità visiva del frame della barra di navigazione che condivide un bordo con la cima dell'UIWindow. La mia barra di navigazione non si trovava da nessuna parte vicino alla cima, quindi si ridimensionò a 44px invece della normale "estensione sotto la barra di stato" 64px. Per ovviare a questo, ho semplicemente completato la transizione prima di animare l'alfa e la posizione del mio toViewController. Cioè, una volta che tutto è stato posizionato correttamente per essere animato, ho chiamato completeTransition: per lasciare che il controller di navigazione si aggiusti da solo mentre è invisibile. Finora, questo non ha avuto effetti collaterali non intenzionali, e l'alfa in più, le animazioni del fotogramma spostate continuano anche dopo di voi completeTransition.

Ecco il mio metodo animateTransition: nella mia presentazione classe animatore che è conforme a <UIViewControllerAnimatedTransitioning>

UIViewController *toViewController   = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    UIViewController *fromViewController  = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 

    UIViewController *presentedViewController = self.presenting ? toViewController : fromViewController; 
    UIView *containerView      = [transitionContext containerView]; 

    NSTimeInterval animationDuration   = [self transitionDuration:transitionContext]; 

    if (self.presenting) { 
     containerView.alpha = 0.0; 
     presentedViewController.view.alpha = 0.0; 
     [containerView addSubview:presentedViewController.view]; 
     [UIView animateWithDuration:animationDuration delay:0 options:kNilOptions animations:^{ 
      containerView.alpha = 1.0; 
     } completion:^(BOOL finished) { 
      presentedViewController.view.frameTop += 20; 
      //I complete the transition here, while my controller's view is still invisible, 
      // but everything is in its proper place. This effectively positions everything 
      // for animation, while also letting the navigation bar resize itself without jarring visuals. 
      [transitionContext completeTransition:YES]; 
      //But we're not done quite yet... 
      [UIView animateWithDuration:animationDuration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
       presentedViewController.view.frameTop -= 20; 
       presentedViewController.view.alpha = 1.0; 
      } completion:nil]; 
     }]; 
    } 

    if (!self.presenting) { 
     [UIView animateWithDuration:animationDuration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
      presentedViewController.view.alpha = 0.0; 
      presentedViewController.view.frameTop += 20; 
     } completion:^(BOOL finished) { 
      [UIView animateWithDuration:animationDuration delay:0 options:kNilOptions animations:^{ 
       containerView.alpha = 0.0; 
      } completion:^(BOOL done) { 
       [transitionContext completeTransition:YES]; 
      }]; 
     }]; 
    } 

Spero che questo aiuti chiunque che si trova nella mia posizione!