2013-09-27 10 views
24

Mi rivolgo a iOS7 nella mia ultima app e toccando la barra di stato non sembra scorrere una tabellaView o collectionView in cima.Impossibile ottenere scrollsToTop che funziona su iOS7

Ho impostato self.tableView.scrollsToTop = true e ancora non succede nulla.

So che Apple ha modificato in modo significativo la barra di stato in iOS7, ma tali modifiche hanno interrotto la funzionalità scrollsToTop?

Aggiornamento

In risposta a un commento in una delle risposte, ho testato per garantire che la mia vista collezione era infatti l'unico ScrollView sullo schermo, ed è stato:

(lldb) po [self.view recursiveDescription] 
<UIView: 0x1092ddf0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x109357e0>> 
    | <UICollectionView: 0x11351800; frame = (0 0; 320 568); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x10966080>; layer = <CALayer: 0x109623a0>; contentOffset: {0, -64}> collection view layout: <UICollectionViewFlowLayout: 0x10940a70> 
    | | <UIImageView: 0x10965fa0; frame = (0 564.5; 320 3.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x10965ee0>> - (null) 
    | | <UIImageView: 0x10948f60; frame = (316.5 561; 3.5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x10966030>> - (null) 

Aggiornamento n. 2

Non sono sicuro se è importante, ma sto utilizzando un NavigationController iOS7 standard in cui la barra di navigazione è trasparente e applica una sfocatura alla mia collezione/tableViews mentre scorrono sotto.

Update # 3

capito. Risulta che I ha fatto avere più di una scrollView sullo schermo. La mia app ha un menu del cassetto sinistro sotto la parte principale dell'app e quel menu ha una tabellaView per le opzioni. Ho semplicemente impostato self.menuTable.scrollsToTop = false e tutto ha funzionato come previsto nel resto dell'app. Non è stato necessario implementare i metodi deltaudi scrollView o altro.

+0

Avete bisogno di impostare qualcosa di simile, self.scrollView.scrollEnabled = YES; ? Ma per la tableview .. – DogCoffee

+0

Un grande suggerimento nell'aggiornamento n. 3, ha funzionato allo stesso modo. Ma la cosa strana è che senza l'aggiornamento # 3 ha funzionato su iOS8 ma non su iOS7. –

risposta

23

Avete più di una vista a scorrimento/vista tabella/vista raccolta sullo schermo? In tal caso, solo uno di essi può avere scrollsToTop impostato su YES, altrimenti iOS7 non scorrerà nessuno di questi verso l'alto.

È possibile anche implementare il metodo UIScrollViewDelegate scrollViewShouldScrollToTop: e restituire SÌ se il passato in vista di scorrimento è uguale a quella che si desidera scorrere verso l'alto:

- (BOOL) scrollViewShouldScrollToTop:(UIScrollView*) scrollView { 
    if (scrollView == self.myTableView) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 
+0

Per quanto posso dire, ho solo il mio TableView in un particolare controller di visualizzazione e un insiemeView su un altro. Ho impostato entrambi su scrollsToTop = true e ho implementato il metodo del delegato scrollview che hai suggerito. Ho gettato una dichiarazione di registro in alto, e quel metodo non viene mai chiamato. Ho provato il simulatore e il dispositivo. – djibouti33

+0

Le viste di entrambi i controller di vista sono visibili contemporaneamente? – Greg

+0

scusa per la confusione. queste sono due parti totalmente diverse dell'app. – djibouti33

11

La risposta breve è che non c'è nulla di diverso in iOS 7. Finché non è caricato più di un UIScrollView, tableView o collectionView scorreranno verso l'alto quando l'utente tocca la barra di stato. La chiave qui è caricata; un altro scrollView non deve necessariamente essere sullo schermo per entrare in conflitto con un altro scrollView che è.

I cassetti scorrevoli a sinistra/a destra sono molto popolari in questi giorni e questo è stato il motivo del mio problema. Ho un menu che contiene le mie opzioni di navigazione e queste sono tutte gestite da un UITableView. Dovevo assicurarmi di impostare menuTable.scrollsToTop = false prima di riuscire a far funzionare le cose nelle altre parti della mia app.

+0

Sì! Questo ha fatto per me! : D –

+0

Grazie! Mi hai salvato la giornata :) – Nikant

+0

Questo sicuramente mi fa risparmiare tempo. – pkc456

4

per gli altri:

ricordare che la vista di scorrimento che si sta cercando può essere anche un UIWebView..not solo UITableView. Un'altra cosa importante è che non si tratta solo di VISUALIZZABILE scrollViews, ma di immagini a scorrimento LOADED.

Se non trovate lo ScrollView, si può sempre Inserisci tabella di prova UITableView, immediatamente quando app sta iniziando, controllare se si tratta di scorrimento verso l'alto, e quindi caricare di più e più punti di vista, fino alla fermata tabella di prova di scorrimento verso l'alto.

7

Il mio problema era che avevo uno UITextView con scrollsToTop impostato su YES, quindi il mio UITableView non rispondeva al gesto. In breve, controlla tutte le altre viste scorrevoli.

+1

+1 Grazie. Questo problema mi stava facendo impazzire ... –

-2

funziona questo sempre per me:

[self.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]; 
4

Se le celle della tabella sono dinamici, rimuovere le seguenti:

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView 
{ 
    return YES; 
} 

creare una nuova funzione come segue:

- (void) disableScrollsToTopPropertyOnAllSubviewsOf:(UIView *)view { 
    for (UIView *subview in view.subviews) { 
     if ([subview isKindOfClass:[UIScrollView class]]) { 
      ((UIScrollView *)subview).scrollsToTop = NO; 
     } 
     [self disableScrollsToTopPropertyOnAllSubviewsOf:subview]; 
    } 
} 

Chiamata la funzione sopra in - (void)viewDidLoad

[self disableScrollsToTopPropertyOnAllSubviewsOf:self.view]; 

Ora abilitare ScrollsToTop per la visualizzazione tabella come segue:

[myTableView setScrollsToTop:YES];