iPhone UITableView PlainStyle avec une image d'arrière-plan personnalisée: entièrement & # 8220; entièrement & # 8221; dans du code
-
08-07-2019 - |
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!
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 unUINavigationController
: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] .