2012-06-05 14 views
5

Ho un'applicazione come l'app foto dove la vista principale è una UIScrollView che occupa l'intera dimensione dello schermo. Inoltre, come l'app per le foto, quando l'utente tocca lo schermo ci sono navigazione traslucida, stato e barre degli strumenti che riappaiono/scompaiono.Schermo intero UIScrollView non funziona correttamente

Ho riscontrato un problema nell'impostare la vista principale UIViewControllers come UIScrollView e occuparla per l'intera lunghezza dello schermo. Il problema è che quando vengono visualizzate le barre di navigazione e di stato, lo UIScrollView viene spinto verso il basso dall'altezza delle barre di navigazione e di stato (non va al di sotto di esse come si suppone). Quando l'utente tocca lo schermo e le barre di navigazione/stato scompaiono, si reimposta automaticamente per occupare tutta la lunghezza dello schermo come si suppone.

Una semplice soluzione per impostare la vista principale come UIView e allegare un UIScrollView su di esso funziona. Tuttavia, mi piacerebbe provare a farlo funzionare senza soluzioni alternative (ad esempio, la regolazione dello UIScrollViews contentInset, ecc.) In teoria dovrebbe funzionare.

Di seguito è il codice che sto attuazione:

- (void)loadView 
{ 

    self.wantsFullScreenLayout = YES; 

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame: CGRectMake(0,0,320,480)]; 
    scrollView.contentSize = CGSizeMake(320, 480); 
    scrollView.scrollEnabled = NO; 
    scrollView.contentOffset = CGPointZero; 
    scrollView.bounces = NO; 
    self.view = scrollView; 
    [scrollView release]; 

} 

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    self.navigationController.navigationBar.translucent = YES; 
    [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackTranslucent animated: NO]; 
    self.navigationController.toolbarHidden = NO; 
    self.navigationController.toolbar.barStyle = UIBarStyleBlack; 
    self.navigationController.toolbar.translucent = YES; 

    [self startTimer]; 
} 

- (void) viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    self.navigationController.navigationBar.translucent = NO; 
    [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleDefault animated: NO]; 

    [self cancelTimer]; 
} 

UPDATE: ho notato è il contentOffset e contentInset che stanno cambiando, non la cornice scrollViews. Quando le barre sono scomparse e la UIScrollView è la dimensione completa dello schermo (come dovrebbe essere), il contentOffset e contentInset sono i seguenti:

Content Offset: {0, -20} 
Content Inset: {20, 0, 44, 0} 

quando le barre sono visibili e la UIScrollView viene spinto verso il basso, il contentOffset e contentInset sono i seguenti:

Content Offset: {0, -64} 
Content Inset: {64, 0, 44, 0} 

risposta

3

Ho parlato con DTS di questo e hanno detto che questo è il comportamento progettato e consigliato di collegare il UIScrollView a un genitore UIView.

+0

Ti benedica! Mi sono solo strappato i capelli. –

-1

Prova essere impostazione:

self.view.frame = CGRectMake(0.f, -44.f, 320.f 480.f); 

Potrebbe non essere adatto alle dimensioni desiderate, ma è possibile regolarlo ...

+0

Ho aggiornato, è il contentOffset che sta cambiando non la cornice. So che posso aggiustare contentOffset per rimediare a questo, ma cercando di trovare una soluzione migliore. –

+0

Non penso che ci sia una soluzione migliore che sovrascrivere alcuni valori che il controller di navigazione cambia automaticamente. Sarebbe il frame o l'offset del contenuto. Puoi avere un normale UIView per self.view, quindi aggiungere UIScrollView come sottoview e giocare con il frame o il contentOffset, ma non esiste una proprietà generica come 'resizeMyControllersMainView' per impostarlo su' NO' ... – graver

5

ho risolto un problema simile sul iOS7 dopo aver letto Guida transizione interfaccia utente di Apple: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html

Si scopre UIViewController ha una proprietà booleana automaticallyAdjustsScrollViewInsets. L'impostazione predefinita è true, la disattivazione di questo ha reso il mio UIScrollView riempire l'intera finestra, invece di essere premuto.

Problemi correlati