2009-06-20 28 views
21

Se si dispone di un UITableView semplice (non raggruppato) con una singola riga, il resto dello schermo è pieno di celle vuote o vuote. Come si modifica l'aspetto di queste celle vuote? Per prima cosa, ho pensato che avrebbero avuto l'aspetto della cella utilizzata nella visualizzazione tabella ma sembra che non lo facciano.Come posso modificare l'aspetto di celle 'vuote' in UITableView semplice?

Le persone del Codice Culturale (cose) hanno fatto un buon lavoro modificando queste celle ma non riesco a pensare immediatamente a un modo per cambiare il loro aspetto.

Qualche consiglio?

+0

* * Bump ottenuto una soluzione che funziona? Si prega di condividere qui. Grazie – lostInTransit

+0

Quello che ho fatto fino ad ora è aggiungere una cella 'invisibile' alla fine della vista tabella con una visualizzazione di immagini che mostra l'ombra della fine della vista tabella. Ho impostato lo stile separatore su none. Questo crea un effetto simile ma dovrò modificarlo un po 'di più per essere felice con esso. –

risposta

20

Anche se non è esattamente quello che stai cercando, si può anche cambiare per visualizzare solo una regione vuota (invece di celle vuote) impostando una vista piè di pagina sul tavolo. Un UIView di altezza 0 farà il trucco.

+1

Con il tuo aiuto, l'ho capito ed è abbastanza semplice. Aggiungi UIImageView desiderato al piè di pagina di UITableView (come hai suggerito) ma per fare in modo che la vista tabella si comporti correttamente devi aumentare la sua altezza con l'altezza di UIImageView. In questo modo, la vista tabella si comporterà come una normale tabella, ma hai il bell'effetto che stavo cercando. Assicurarsi di rimuovere i separatori di celle della vista tabella. –

+0

Hai qualche codice per questo che funziona? Ho difficoltà a riprodurre ciò che è spiegato qui –

+0

Ecco cosa ha funzionato per me. In iOS 6.1, non sembra che debba aumentare l'altezza della vista: myTableView.tableFooterView = [[[UIView alloc] initWithFrame: CGRectZero] autorelease]; –

0

Probabilmente sarà necessario creare una sottoclasse personalizzata di UITableView che riempia lo sfondo con l'aspetto di celle vuote.

- (void)drawRect:(CGRect)rect { 
    [super drawRect: rect]; 

    // draw your background here if the rect intersects with the background area 
} 
5

Ho impostato una sottoclasse UIView ~ 300px-high per le mie visualizzazioni di intestazione e piè di pagina TableView, regolando gli insiemi di TableView in modo da compensare queste visualizzazioni (impostare gli insiemi superiore e inferiore a -300px).

mio UIView sottoclasse implementa il metodo drawRect, in cui uso CGContextDrawTiledImage() disegnare un vuoto UITableViewCell ripetutamente:

- (void)drawRect:(CGRect)rect { 

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 46),NO,0.0); 
    emptyCell = [[SWTableViewCell alloc] initWithFrame:CGRectZero]; 
    [emptyCell drawRect:CGRectMake(0, 0, 300, 46)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    [emptyCell release]; 
    UIGraphicsEndImageContext(); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextScaleCTM (context, 1, -1); // this prevents the image from getting drawn upside-down 
    CGContextDrawTiledImage(context, CGRectMake(0, 0, 300, 46), [newImage CGImage]); 
} 

Nel mio caso i miei tableviewcells sono 46px alto, quindi se voglio fare UIView sottoclasse di contenere 8 di queste celle vuote, ho bisogno di renderlo alto 368 px.

+0

Mi piace questa soluzione, ma potrebbe utilizzare alcune modifiche. Per uno, penso che allocare una tableviewcell per disegnarla sia piuttosto pesante. L'idea alla base è geniale: le celle vuote rifletteranno automaticamente le modifiche apportate al design personalizzato tableviewcell. Dovrei comunque immaginare che il design non cambierebbe molto spesso, quindi probabilmente non è un buon caso d'uso usare questo approccio generico. Piuttosto, vorrei solo creare un'immagine da come appare la cella e usarla. – memmons

+1

Inoltre, non sono un fan dei numeri magici nel codice. Capisco perché sei costretto a usarli qui - devi conoscere la cornice del contesto _prima_ carichi la cella vuota - ma in realtà dovresti disegnare alla dimensione corretta che ti è stata data. – memmons

+0

Tenendo presente quanto sopra, ho aggiunto una risposta basata sul codice, ma che acquisisce direttamente l'immagine di sfondo anziché utilizzare una tabellaViewCell effettiva. Tuttavia, ho dato anche questa risposta +1 poiché penso che sia un approccio interessante e praticabile. – memmons

7

In base alla risposta samvermette's, ma modificato per utilizzare direttamente un'immagine di sfondo piuttosto che comporre un'immagine da una sottoclasse UITableViewCell. La risposta di Sam è buona, ma sarà meno performante rispetto alla semplice creazione di un'immagine di sfondo direttamente.

creare una sottoclasse UIView - in questo esempio ho chiamato CustomTiledView - e aggiungere il seguente codice alla classe:

- (void)drawRect:(CGRect)rect { 
UIImage *image = [UIImage imageNamed:@"tableview_empty_cell_image"]; 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextScaleCTM (context, 1, -1); 
CGContextDrawTiledImage(context, 
         CGRectMake(0, 0, rect.size.width, image.size.height), 
         [image CGImage]); 
} 

Aggiungere il seguente codice al tuo tableviewcontroller:

- (CGFloat)tableView:(UITableView *)tableView 
      heightForFooterInSection:(NSInteger)section { 
    // this can be any size, but it should be 1) multiple of the 
    // background image height so the last empty cell drawn 
    // is not cut off, 2) tall enough that footer cells 
    // cover the entire tableview height when the tableview 
    // is empty, 3) tall enough that pulling up on an empty 
    // tableview does not reveal the background. 
     return BACKGROUND_IMAGE_HEIGHT * 9; // create 9 empty cells 
} 

- (UIView *)tableView:(UITableView *)tableView 
      viewForFooterInSection:(NSInteger)section { 
    CustomTiledView *footerView = [[CustomTiledView alloc] init]; 
    return [footerView autorelease]; 
} 

Infine, dovrai impostare il contenuto inferiore della tabella viewview sul valore negativo del valore restituito da -tableView:heightForFooterInsection: In questo esempio sarà -1*BACKGROUND_IMAGE_HEIGHT*9. È possibile impostare il contenuto in basso nella finestra di ispezione delle dimensioni di Interface Builder o impostando la proprietà self.tableView.contentInset da tableviewcontroller.

Cheers!

0

Credo che l'approccio all'uso del metodo UITableViewtableView:viewForFooterInSection: non funzionerà per il caso in cui la tabella è vuota, ad es., Senza celle.In tal caso, è possibile utilizzare la tecnica Answerbot proposto può essere riproposto per farcire il creato UIView in vista piè di pagina del tavolo in modo esplicito, come la seguente:

CGRect cellRect = CGRectMake(0, 0, table.bounds.size.width, table.bounds.size.height); 
    CustomTiledView *footerView = [[[CustomTiledView alloc] initWithFrame:cellRect] autorelease]; 
    table.tableFooterView = footerView; 
1

Se si desidera semplicemente modificare l'altezza delle "celle vuote "quando non ci sono celle nel TableView: è necessario impostare la proprietà rowHeight di UITableView (l'implementazione di tableView:heightForRowAtIndexPath: non ha alcun effetto su TableViews vuoti). Se ci sono celle nel tuo TableView e hai implementato tableView:heightForRowAtIndexPath: allora l'altezza dell'ultima riga sarà usata per le celle vuote.

+0

Questo cambierà l'altezza di tutte le celle, indipendentemente da cosa sia 'tableView: heightForRowAtIndexPath:' does. – executor21

+0

@ executor21: non vero, 'tableView: heightForRowAtIndexPath:' sovrascrive sempre il valore impostato tramite la proprietà 'rowHeight', ma verrà applicato solo se è presente almeno una cella. –

3

Da http://jomnius.blogspot.com/2011/03/hide-uitableview-empty-cell-separator.html modo semplice è quello di definire quel tavolo non ci sono linee di separazione delle cellule:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

modo più difficile, se avete bisogno di linee di separazione, è quello di definire quel tavolo non ha linee di separazione e di creare linee di separazione delle cellule come parte di UITableViewCell personalizzato. Parte inferiore della cella, ovviamente, e molto probabilmente utilizzando un'immagine grafica davvero sottile. Ricordarsi di definire l'autosizing e la modalità dell'immagine in modo corretto.

Un altro modo è quello di definire un vuoto tableFooterView del UITableView:

UIView *footer = 
    [[UIView alloc] initWithFrame:CGRectZero]; 
self.myTable.tableFooterView = footer; 
[footer release]; 
Problemi correlati