iPhone UITableView PlainStyle avec une image d'arrière-plan personnalisée: entièrement & # 8220; entièrement & # 8221; dans du code

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

Question

Je suis allé partout, semble-t-il que le UITableView présentant un problème d'arrière-plan statique est bien documenté, mais que personne ne dispose d'une solution simple? Je construis mon TableViews entièrement en code, comme ceci:

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

La fenêtre est ma principale UIWindow pour moi dans le délégué de l'application. À partir de là, je dois créer quelques TableViews (contrôlés par le navigationController ), certains avec fetchedResultsControllers , des cellules personnalisées, etc. Je préfère le faire entièrement dans le code, sans utiliser de nib, car cela entraînerait une personnalisation répartie entre le code et l'IB ou la construction et la maintenance de plus de 6 Nib différents.

Je ne parviens tout simplement pas à trouver un exemple concret dans lequel une classe tableViewController définit sa propre image d'arrière-plan. Si je le fais dans l’un de mes TableViews (extension de UITableViewController ):

self.tableView.backgroundColor = backgroundColor;

J’ai bien sûr coloré l’arrière-plan de la tableView (qui colorie aussi celle de la cellule, mais pense que celle-ci hérite de la couleur de la tableView ?), mais je souhaite une image d’arrière-plan statique qui mes cellules glissent de haut en bas. Pas une " image de fond " qui glisse de haut en bas avec les gestes des utilisateurs. Exactement ce que propose la tableView de GroupedStyle, mais dans une table PlainStyle: .. et fait en utilisant du code, pas IB.

Je suppose que je dois effacer la couleur d'arrière-plan de la vue tableau, puis définir la couleur des cellules lors de leur configuration afin qu'elles ne deviennent pas transparentes. Et puis en quelque sorte "faufiler" une image d’arrière-plan sous la vue TableView depuis l’intérieur de l’instance tableView?

Comment vais-je procéder, la meilleure solution serait de pouvoir le faire dans viewDidLoad ou dans toute autre fonction de mon TableViewController, afin de conserver toutes mes personnalisations au même endroit.

J'espère que quelqu'un pourra m'aider, je suis tout «googlé» :) Merci!

Était-ce utile?

La solution

Vous devez configurer votre contrôleur en tant que UIViewController , et non pas UITableViewController . Ajoutez ensuite la tableview par programme au-dessus d'un arrière-plan imageView .

@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

Autres conseils

Tous ces sauts sont inutiles si vous ciblez > iOS 3.2, où vous pouvez utiliser le nouveau backgroundView pour définir directement un UIImageView, par exemple:

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

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

Ok, maintenant il tourne :) Mon tableau n'a pas été peuplé avec mes cellules, donc faites un breakpoint dans ce que j'ai découvert Même si j'avais implémenté TableViewDataSource et TableViewDelegate, ce n'était que dans la vue principale, j'avais besoin de définir le délégué et la source de données de la vue de table sur = self. Pour les autres cherchant une réponse à cette question, voici la méthode qui a abouti à l'aide de 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;

}

Merci Coneybeare.

Il ne plante plus et l’arrière-plan est parfait (avec mon navigationController en haut) Cependant, toujours pas de table visible? juste l'image de fond et la barre de navigationController:

Voici mon implémentation:

- (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, mémoire… etc.

Le forum n'a pas pu contenir un fichier .m entier en une fois. Dites-moi si je laisse quelque chose qui pourrait aider à indiquer une erreur.

Je pensais que c'était peut-être l'ordre des couches et je l'ai essayé sans aucune chance:

    [self.view sendSubviewToBack:imageView];

J'espère que j'ai raté quelque chose d'évident.

Merci pour votre temps :))

Quelques conseils:

  • Si vous utilisez un UISplitViewController :

    splitViewController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • Si vous utilisez un UINavigationController :

    navigationController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • Si vous utilisez à la fois un UISplitViewController et un UINavigationController :

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

Veillez à définir la couleur d'arrière-plan de tout UIView que vous souhaitez voir transparaître au-dessus du UINavigationController ou du UISplitViewController sur < code> [UIColor clearColor] .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top