iPhone UITableView PlainStyle con immagine di sfondo personalizzata - eseguita "interamente" nel codice

StackOverflow https://stackoverflow.com/questions/1637738

Domanda

Sono stato dappertutto, sembra che UITableView con un problema di background statico sia ben documentato, ma nessuno con una soluzione semplice? Sto costruendo il mio TableViews interamente in codice, in questo modo:

    UIViewController *tableViewController = [[TableViewController alloc] init];
navigationController = [[UINavigationController alloc]
                        initWithRootViewController:tableViewController];
[tableViewController release];
[window addSubview:navigationController.view];

La finestra è il mio UIWindow principale creato per me nel delegato dell'app. Da qui in poi ho bisogno di creare alcuni TableViews (controllati dal navigationController ), alcuni con fetchedResultsControllers , celle personalizzate e così via. Preferisco farlo completamente nel codice, non usando i pennini in quanto ciò comporterebbe o la diffusione della personalizzazione tra codice e IB o la necessità di costruire e mantenere più di 6 pennini diversi.

Semplicemente non riesco a trovare un esempio funzionante in cui una classe tableViewController imposta la propria immagine di sfondo. Se lo faccio all'interno di una delle mie TableViews (estendendo UITableViewController ):

self.tableView.backgroundColor = backgroundColor;

Ovviamente, ho colorato lo sfondo del tableView (che per inciso colora anche quello della cella, pensi che la cella erediti il ??suo colore dal tableView ?) ma vorrei avere un'immagine di sfondo statica che le mie cellule scivolano su e giù sopra. Non un'immagine "di sfondo" che scorre su e giù con i gesti degli utenti. Esattamente quello che offre la tableView di GroupedStyle, ma in una tableView di PlainStyle :) .. e fatto usando il codice, non IB.

Suppongo di dover cancellare il colore di sfondo della vista tabella, quindi impostare il colore Celle durante la configurazione in modo che non risultino trasparenti. E poi in qualche modo " furtivamente " un'immagine di sfondo sotto la vista tableView dall'interno dell'istanza tableView?

Come posso procedere, la soluzione migliore sarebbe quella di poterlo fare in viewDidLoad o qualsiasi altra funzione all'interno del mio TableViewController, per mantenere tutte le mie personalizzazioni in un unico posto.

Spero che qualcuno mi possa aiutare, sono tutto 'googled out :) :) Grazie!

È stato utile?

Soluzione

Devi impostare il tuo controller come UIViewController , non come UITableViewController . Quindi aggiungi tableview a livello di codice sopra uno imageView in background.

@interface SomeController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
  ...
  UITableView *tableView;
  ...
}
@property (nonatomic, retain) UITableView *tableView;
@end



@implementation SomeController

@synthesize tableView;

...

- (void)loadView {
    [super loadView];
    UIImageView *v = [[[UIImageView alloc] initWithFrame:self.view.bounds] autorelease];
    [v setImage:[UIImage imageNamed:@"table_background.png"]];
    [self.view addSubview:v];


    self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease];
    [self.tableView setBackgroundColor:[UIColor clearColor]];
    [self.view addSubview:self.tableView];
}
...
@end

Altri suggerimenti

Tutto questo saltare attraverso i cerchi non è necessario se stai prendendo di mira > iOS 3.2, dove è possibile utilizzare il nuovo backgroundView per impostare direttamente un UIImageView, ad esempio:

// In your UITableViewController subclass
- (void)viewDidLoad
{
    [super viewDidLoad];

    UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]];
    self.tableView.backgroundView = view;
}  

Ok, ora è in esecuzione :) Il mio tableView non era popolato con le mie celle, quindi breakPointing attraverso la cosa che ho scoperto che anche se avevo implementato TableViewDataSource e TableViewDelegate, questo era solo nella vista principale, dovevo impostare il delegato e l'origine dati di tableview su = self. Per altri che cercano una risposta a questo qui è il metodo in quanto è finito con l'aiuto di Coneybeares:

- (void)loadView {
[super loadView];

UIImageView *imageView = [[[UIImageView alloc] initWithFrame:self.view.bounds] autorelease];
[imageView setImage:[UIImage imageNamed:@"carbon_background.png"]];
[self.view addSubview:imageView];

[self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds] autorelease];
[self.tableView setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:self.tableView];

self.tableView.delegate = self;
self.tableView.dataSource = self;

}

Grazie Coneybeare.

Non si blocca più e l'immagine di sfondo risulta perfetta (insieme al mio controller di navigazione in alto) Tuttavia, non è ancora visibile tableView? solo l'immagine di sfondo e la barra di navigazione:

Questa è la mia implementazione:

- (void)loadView {
[super loadView];

UIImageView *imageView = [[[UIImageView alloc] initWithFrame:self.view.bounds] autorelease];
[imageView setImage:[UIImage imageNamed:@"carbon_background.png"]];
[self.view addSubview:imageView];

[self.tableView = [[UIView alloc] initWithFrame:self.view.bounds] autorelease];

[self.tableView setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:self.tableView];

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView {
return 1;

}

- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section {
return 3;

}

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = @"Hello, World";

return cell;

}

// commit edit, didSelectRow, memory & # 8230; ecc.

Il forum non ha funzionato per un intero file .m in una volta sola. Per favore, dimmi se ho lasciato fuori qualcosa che potrebbe aiutare a indicare un errore.

Ho pensato che forse era l'ordine dei livelli e ci ho provato senza fortuna:

    [self.view sendSubviewToBack:imageView];

Spero di aver perso qualcosa di ovvio.

Grazie per il tuo tempo :)

Alcuni consigli:

  • Se si utilizza un UISplitViewController :

    splitViewController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • Se si utilizza un UINavigationController :

    navigationController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • Se si utilizza sia un UISplitViewController che un UINavigationController :

    navigationController.view.backgroundColor = [UIColor clearColor];
    splitViewController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    

Assicurati di impostare il colore di sfondo di qualsiasi UIView che desideri vedere che si trova sopra UINavigationController o UISplitViewController su < codice> [UIColor clearColor] .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top