2013-11-20 12 views
11

Ho un UINavigationController nella mia app. UINavigationBar è impostato su opaco e tutte le visualizzazioni di scorrimento non si sovrappongono sotto la barra.iOS7 UIRefreshControl cambia contenutoInset

In una vista ho un UITableView. La cornice di UITableView è (0 0; 320 504) sul mio iPhone 5. Ad esempio, l'altezza è 568 - 64 (l'altezza della barra di navigazione e della barra di stato).

Il contentInset dello UITableView è (0, 0, 0, 0). Quando la vista tabella viene caricata per la prima volta, contentOffset è (0, 0).

Questo va bene. Funziona brillantemente.

Ho aggiunto un UIRefreshControl alla visualizzazione tabella. Funziona un paio di volte ma poi, dopo aver fatto alcune volte il pull per aggiornare, il contenuto nella parte superiore viene "bloccato" sotto la barra di navigazione.

Quando ciò accade, ispeziono lo contentInset ed è ora (-60, 0, 0, 0).

C'è un modo per impedire a UIRefreshControl di modificare contentInset?

+0

Rimosso la mia risposta poiché l'hai già escluso chiaramente. Suppongo che tu stia chiamando endRefreshing? – jhilgert00

+0

Nessun problema. Sì, quando chiamo 'endRefreshing' sul controllo scompare. Funziona bene un paio di volte ma poi non funziona e il 'contentInset' cambia nascondendo le prime righe sotto la barra di navigazione. – Fogmeister

+0

Probabilmente potresti riuscire a ripristinare il fotogramma dopo l'aggiornamento, ma non dovresti farlo. – jhilgert00

risposta

6

Questo è probabilmente il motivo per cui UIRefreshControl al momento è supportato solo su UITableViewController, piuttosto che in aggiunta a qualsiasi scrollview (che in molti casi è possibile eliminare, in molti casi).

Il controllo di aggiornamento fa la sua magia armeggiando con gli inserimenti di contenuto della scrollview - in particolare quando termina l'aggiornamento. Sfortunatamente il controller della vista sta anche armeggiando con gli insiemi di contenuto della vista di scorrimento per adattarlo sotto il nav trasparente e le barre di stato. Segue il divertimento. È anche un problema su iOS 6 (o "buon vecchio iOS6" come l'ho chiamato quando si tratta dello stesso problema).

La soluzione più rapida è probabilmente quella di aggiungere la vista tabella come un bambino UITableViewController invece di una semplice visualizzazione secondaria. Penso che UITableViewController gestisca gli inserimenti per te alla fine del refresh. Se ciò non funziona, ho soluzioni alternative per questo, ma dovrà aspettare fino al mio ritorno in ufficio.

+1

Mi sembra di aver risolto questo ora. Mi sono reso conto che il 'completionBlock' di' NSOperation' è chiamato sullo stesso thread dell'operazione. Questo è dove stavo chiamando 'endRefreshing'. Ho inviato questo al thread principale e ora funziona senza modificare 'contentInset'. Hai un link a qualcosa su 'UIRefreshControl' supporta solo ufficialmente' UITVC'? – Fogmeister

+0

I documenti dicono che è fatto per essere assegnato a un UITVC. L'addSubview: la cosa è menzionata solo su SO, mai nei documenti. – jrturton

+0

Vedere il commento di Dave DeLong su questa risposta: http://stackoverflow.com/a/12502450/852828 – jrturton

3

Ripristina il contenuto della tabella contentInset.

-(void)pullToRefresh 
{ 
    [self.tableView reloadData]; 
    [self.refreshControl endRefreshing]; 
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 
} 
2

È necessario sostituire setContentInset: in te UICollectionView

- (void)setContentInset:(UIEdgeInsets)contentInset { 
    if (self.tracking) { 
    CGFloat difference = contentInset.top - self.contentInset.top; 
    CGPoint translation = [self.panGestureRecognizer translationInView:self]; 
    translation.y -= difference * 3.0/2.0; 
    [self.panGestureRecognizer setTranslation:translation inView:self]; 
    } 
    [super setContentInset:contentInset]; 
} 
+0

che hai menzionato non esiste più – Nagarjun

6

vorrei aggiungere questa risposta qui nel caso qualcuno ha problemi con UIRefreshControl modificando le proprietà di controllo (titolo attribuito, tinta, ecc .. .):

Non scherzare con lo UIRefreshControl su -viewDidLoad:, utilizzare -viewDidAppear: invece.

+1

Assicurati di aver inserito una condizione se (! RefreshControl) altro ogni volta che viene visualizzata la tua pagina aggiungi refreshcontrol ad esso. – George

+0

Risolto il problema, grazie. –