2011-12-06 14 views
5

L'altezza della riga oltre l'ultima riga in TableView (le righe di segnaposto vuote che sono lì solo per i dettagli visivi se il numero di elementi è inferiore al numero di righe che un TableView può visualizzare allo stesso tempo) è sempre lo stesso del ultima altezza della fila.È possibile modificare l'altezza delle righe segnaposto in UITableView senza creare una fila fittizia?

È possibile modificare questo senza ricorrere all'aggiunta di una riga fittizia ultima?

Screenshot

+1

Non c'è alcuna riga oltre l'ultima riga in un TableView (a meno che non abbia frainteso la parola * last *). – PengOne

+0

@PengOne Mi riferisco alle righe segnaposto presenti quando il numero di elementi è inferiore al numero di righe che TableView può contenere. – pixelfreak

+1

ridimensiona l'altezza del frameView della tabella per nascondere le righe del segnaposto? – changx

risposta

1

Il UITableView metodo privato esempio _spacingForExtraSeparators restituisce l'altezza delle righe segnaposto. Se non stai scrivendo un'app per l'App Store, basta ignorarlo. Restituisce un CGFloat.

Ecco un approccio diverso che è conforme ad App Store (per quanto ne so) e potrebbe essere più semplice della creazione di una riga fittizia.

UITableView invia a se stesso il messaggio layoutSubviews molto. Lo fa ogni volta che aggiunge, rimuove o riorganizza le celle e ogni volta che scorre (e probabilmente anche altre volte). Quindi, sovrascriviamo layoutSubviews per disegnare una vista che inizia dal bordo inferiore dell'ultima sezione della vista tabella. La vista verrà riempita con un motivo ripetuto che assomiglia a celle segnaposto con un'altezza definita dall'utente.

Creare una sottoclasse di UITableView. Assegna alla sottoclasse una variabile di istanza UIView *_bottomView. Dobbiamo ignorare lo layoutSubviews, quindi inizializzeremo lo _bottomView pigramente in questo metodo.

@implementation MyTableView 
{ 
    UIView *_bottomView; 
} 

Override layoutSubviews. La prima cosa che fai nel tuo layoutSubviews è chiamare [super layoutSubviews] così continuerai a comportarti come un vero UITableView.

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

La prossima cosa che devi fare è pigramente inizializzare _bottomView.

if (!_bottomView) { 

Hai bisogno di un modello per riempire _bottomView, e ha bisogno di guardare come le cellule segnaposto. Crea un contesto immagine largo 1 pixel e alto quanto vuoi che sia una cella segnaposto. Riempi il contesto con il bianco e dipingi una linea di separazione (pixel, in realtà) nella parte inferiore. Ottieni l'immagine dal contesto.

 UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, placeholderHeight), YES, 0); 
     [[UIColor whiteColor] setFill]; 
     UIRectFill(CGRectMake(0, 0, 1, placeholderHeight)); 
     [self.separatorColor setFill]; 
     UIRectFill(CGRectMake(0, placeholderHeight - 1, 1, 1)); 
     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

Successivamente, creare _bottomView, impostare lo sfondo "colore" a quell'immagine come un pattern ripetuto, e aggiungere te stesso come una visualizzazione secondaria.

 _bottomView = [[UIView alloc] initWithFrame:CGRectZero]; 
     _bottomView.opaque = YES; 
     _bottomView.backgroundColor = [UIColor colorWithPatternImage:image]; 
     [self addSubview:_bottomView]; 
    } // end of if-block 

Infine, trova il retto della tua ultima sezione. Usa quel rettangolo per calcolare un frame per _bottomView che inizia nella parte inferiore dell'ultima sezione, è molto alto (il doppio della tua altezza è più che sufficiente) ed è largo quanto il rect dell'ultima sezione.

int lastSectionIndex = [self.dataSource numberOfSectionsInTableView:self] - 1; 
    if (lastSectionIndex < 0) 
     lastSectionIndex = 0; 
    CGRect lastSectionRect = [self rectForSection:lastSectionIndex]; 
    CGRect bottomViewFrame = CGRectMake(lastSectionRect.origin.x, CGRectGetMaxY(lastSectionRect), lastSectionRect.size.width, self.bounds.size.height * 2); 
    _bottomView.frame = bottomViewFrame; 

Infine, assicurarsi _bottomView è la vostra visualizzazione secondaria in primo piano in modo che si overdraw UITableView 's cellule segnaposto.

[self bringSubviewToFront:_bottomView]; 
} // end of layoutSubviews 

Fine.

@end 
+0

Ho cambiato la mia risposta. Questo dovrebbe essere più semplice dell'uso di una fila fittizia. –

+0

Wow, grazie per la risposta dettagliata :) Non sono sicuro che sia più semplice dell'uso di una fila fittizia. Mi bastano 7 righe di codice. – pixelfreak

+0

Suppongo che dipenda dalla complessità del tuo modello, sia che tu permetta la modifica, sia che tu usi un menu di riga, ecc. –

0

Non penso che ci sia un'API pubblica per farlo. È ragionevole utilizzare l'altezza dell'ultima riga come altezza righe segnaposto.

Se si desidera modificare l'altezza delle righe segnaposto, come so, aggiungere una cella fittizia vuota alla fine delle celle è l'unico modo per farlo.

Proprio come hai fatto.

Problemi correlati