2012-10-16 13 views
6

Ho creato un UITableView che voglio scorrere sotto la barra di stato nera semitrasparente. Nel mio XIB, ho appena impostato la posizione y della vista tabella su -20 e tutto sembra a posto.UITableView con UIRefreshControl in una barra di stato semitrasparente

Ora, ho appena aggiunto un UIRefreshControl iOS6 pull-to-refresh che funziona tuttavia, a causa della posizione -20 y, trascina da dietro la barra di stato. Mi piacerebbe che fosse "allungato a" posizione per essere sotto la barra di stato piuttosto che dietro.

Ha senso il motivo per cui è un problema, ma non sembra esserci alcuna differenza cambiando il suo frame e il contenuto del pannello di inserzioni, ecc non fanno la differenza.

I documenti suggeriscono che una volta impostato refreshControl, UITableViewController si occupa della posizione da quel momento in poi.

Qualche idea?

risposta

0

UIRefreshControl si trova sempre sopra il contenuto nel UITableView. Se è necessario modificare la posizione di refreshControl, provare a modificare il numero contentInset. Lo UIRefreshControl tiene conto di ciò nel determinare dove dovrebbe essere posizionato.

+0

Sì ho provato. Riguarda solo il contenuto, non il controllo di aggiornamento :( – NonatomicRetain

+0

Lo stesso problema qui il mio UITableView ha un inserto UIEdgeInsets inset = UIEdgeInsetsMake (37, 0, 0, 0); tblAccounts.contentInset = inset; Ma il refreshControl ignora l'inserto – Andy

4

Proprio sottoclasse l'UIRefreshControl e override layoutSubviews come questo:

- (void)layoutSubviews 
{ 
    UIScrollView* parentScrollView = (UIScrollView*)[self superview]; 

    CGSize viewSize = parentScrollView.frame.size; 

    if (parentScrollView.contentInset.top + parentScrollView.contentOffset.y == 0 && !self.refreshing) { 
     self.hidden = YES; 
    } else { 
     self.hidden = NO; 
    } 

    CGFloat y = parentScrollView.contentOffset.y + parentScrollView.scrollIndicatorInsets.top + 20; 

    self.frame = CGRectMake(0, y, viewSize.width, viewSize.height); 

    [super layoutSubviews]; 
} 
+0

Questo codice non tiene conto del fatto che 'UIRefreshControl' si sta muovendo ed espandendo, non semplicemente spostandosi con scrollView. –

+0

Ho aggiunto del codice per prendere in considerazione l'iniziale "abbattimento", ora apparirà come dovrebbe :). –

0

Prova questo:

CGFloat offset = 44; 
for (UIView *subview in [self subviews]) { 
    if ([subview isKindOfClass:NSClassFromString(@"_UIRefreshControlDefaultContentView")]) { 
     NSLog(@"Setting offset!"); 
     [subview setFrame:CGRectMake(subview.frame.origin.x, subview.frame.origin.y + offset, subview.frame.size.width, subview.frame.size.height)]; 
    } 
} 

Questo sposterà UIRefreshControll giù per 44 punti;

9

È possibile sottoclasse il UIRefreshControl e implementare layoutSubviews in questo modo:

@implementation RefreshControl { 
    CGFloat topContentInset; 
    BOOL topContentInsetSaved; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    // getting containing scrollView 
    UIScrollView *scrollView = (UIScrollView *)self.superview; 

    // saving present top contentInset, because it can be changed by refresh control 
    if (!topContentInsetSaved) { 
     topContentInset = scrollView.contentInset.top; 
     topContentInsetSaved = YES; 
    } 

    // saving own frame, that will be modified 
    CGRect newFrame = self.frame; 

    // if refresh control is fully or partially behind UINavigationBar 
    if (scrollView.contentOffset.y + topContentInset > -newFrame.size.height) { 
     // moving it with the rest of the content 
     newFrame.origin.y = -newFrame.size.height; 

    // if refresh control fully appeared 
    } else { 
     // keeping it at the same place 
     newFrame.origin.y = scrollView.contentOffset.y + topContentInset; 
    } 

    // applying new frame to the refresh control 
    self.frame = newFrame; 
} 

Ci vuole del contentInset tableView in considerazione, ma è possibile modificare topContentInset variabile a qualsiasi valore è necessario e sarà gestire il resto.

Spero che il codice sia sufficientemente documentato per capire come funziona.

+0

Funziona come un fascino. Grazie Anthony! – George

1

Il current upvoted answer non funziona bene con il fatto che si tira giù il componente (come indicato da Anthony Dmitriyev), l'offset non è corretto. L'ultima parte è risolverlo.

In entrambi i casi: sottoclasse il UIRefreshControl con il seguente metodo:

- (void)layoutSubviews 
{ 
    UIScrollView* parentScrollView = (UIScrollView*)[self superview]; 
    CGFloat extraOffset = parentScrollView.contentInset.top; 

    CGSize viewSize = parentScrollView.frame.size; 

    if (parentScrollView.contentInset.top + parentScrollView.contentOffset.y == 0 && !self.refreshing) { 
     self.hidden = YES; 
    } else { 
     self.hidden = NO; 
    } 

    CGFloat y = parentScrollView.contentOffset.y + parentScrollView.scrollIndicatorInsets.top + extraOffset; 

    if(y > -60 && !self.isRefreshing){ 
     y = -60; 
    }else if(self.isRefreshing && y <30) 
    { 
     y = y-60; 
    } 
    else if(self.isRefreshing && y >=30) 
    { 
     y = (y-30) -y; 
    } 

    self.frame = CGRectMake(0, y, viewSize.width, viewSize.height); 

    [super layoutSubviews]; 
} 
+0

Perché scrivi questa riga di codice y = (y-30) -y; dopo l'apertura delle parentesi sarà y = 30; Come capire dovrebbe essere y = y - 30 –

0

ho trovato il primario dei layoutSubviews nelle altre risposte hanno più di cambiare il telaio, cambiano anche il comportamento (il controllo ha iniziato scorrevole giù con il contenuto). Per modificare il telaio, ma non il comportamento che ho fatto questo:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    CGRect frame = self.frame; 
    CGFloat desiredYOffset = 50.0f; 
    self.frame = CGRectMake(frame.origin.x, frame.origin.y + desiredYOffset, frame.size.width, frame.size.height); 

}

Problemi correlati