iPhone UITableView PlainStyle imagem de fundo personalizada com - feito “inteiramente” no código

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

Pergunta

Eu estive em todo o lugar, parece que o UITableView com um problema de fundo estático é bem documentada, mas ninguém com uma solução para a frente? Im construindo meu TableViews completamente em código, como este:

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

A janela é a minha principal construção UIWindow para mim no delegado aplicativo. De agora em diante eu preciso para construir uma TableViews poucos diferente (controlado pelo navigationController), alguns com fetchedResultsControllers, células personalizados e assim por diante. Eu prefiro fazer isso completamente em código, não usando nib de como isso resultaria em ambos tendo se espalhado personalização entre o código e IB ou ter que construir e manter 6+ diferentes Nibs.

Eu simplesmente não pode encontrar um exemplo de trabalho onde um tableViewController Classe define a sua imagem de fundo próprio. Se eu fizer isso um dentro da minha TableViews (estendendo UITableViewController):

self.tableView.backgroundColor = backgroundColor;

Eu, é claro, se o fundo do tableView colorido (que, aliás cores da célula é assim, acho que herda da célula sua cor do tableView?), Mas eu gostaria de ter uma imagem de fundo estática que minhas células deslizar para cima e para baixo em topo de. Não uma "imagem de fundo" que desliza para cima e para baixo com os gestos de usuários. Exatamente o que as ofertas GroupedStyle TableView, mas em um PlainStyle tableView :) .. e feito usando o código, não IB.

Eu acho que tem que limpar a cor da exibição de tabela de fundo, em seguida, definir a cor de células quando configurá-los para que eles não saem transparente. E, em seguida, de alguma forma, uma imagem de fundo por baixo da vista tableView "sneak" de dentro da instância tableView?

Como vou fazer isto, a melhor solução seria para ser capaz de fazer isso em viewDidLoad ou qualquer outra função dentro da minha TableViewController, para manter toda a minha personalização em um só lugar.

Espero que alguém possa me ajudar, Im all 'pesquisei out' :) Obrigado!

Foi útil?

Solução

Você precisa configurar o controlador como uma UIViewController, não um UITableViewController. Em seguida, adicione o tableview programaticamente acima de um imageView fundo.

@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

Outras dicas

Tudo isso saltar através de aros é desnecessário se você está alvejando> iOS 3.2, onde você pode usar o novo backgroundView propriedade para definir um UIImageView directamente, por exemplo:

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

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

Ok, agora ele está sendo executado :) Meu tableView não foi preenchida com minhas células, de modo breakPointing através da coisa que eu descobri que mesmo que eu tinha implementado o TableViewDataSource e TableViewDelegate, este foi apenas na vista principal, eu precisava para definir o delegado e fonte de dados do tableview to = self. Para outros que procuram uma resposta para isso aqui é o método como acabou com Coneybeares ajuda:

- (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;

}

Graças Coneybeare.

Ele não falhar mais e a imagem de fundo torna-se simplesmente perfeito (junto com meu navigationController no topo) No entanto, ainda tableView não visível? apenas a imagem de fundo eo navigationControllerBar:

Esta é a minha aplicação:

- (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;

}

// cometer editar didSelectRow, memória ... etc.

O fórum não era para todo um arquivo .m de uma só vez. Por favor, diga-me se eu deixei algo que poderia ajudar a indicar um erro.

Eu pensei que talvez fosse a ordem das camadas e tentou acessar este sem qualquer sorte:

    [self.view sendSubviewToBack:imageView];

A esperança eu perdi algo óbvio.

Obrigado pelo seu tempo:)

Algumas dicas:

  • Se estiver usando um UISplitViewController:

    splitViewController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • Se estiver usando um UINavigationController:

    navigationController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • Se estiver usando tanto um UISplitViewController e uma UINavigationController:

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

Certifique-se de definir a cor de qualquer UIView que você quer ver através desse fundo é em cima do UINavigationController ou UISplitViewController para [UIColor clearColor].

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top