iPhone UITableView PlainStyle con imagen de fondo personalizada - hecho & # 8220; completamente & # 8221; en codigo

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

Pregunta

He estado por todas partes, parece que el UITableView con un problema de fondo estático está bien documentado, pero ¿nadie con una solución directa? Estoy construyendo mis TableViews completamente en código, así:

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

La ventana es mi compilación principal UIWindow para mí en el delegado de la aplicación. De aquí en adelante, necesito crear algunos TableViews (controlados por navigationController ), algunos con fetchedResultsControllers , celdas personalizadas, etc. Prefiero hacer esto completamente en código, no usar plumines ya que esto daría como resultado que la personalización se extienda entre el código y el IB o que tenga que construir y mantener más de 6 plumines diferentes.

Simplemente no puedo encontrar un ejemplo de trabajo donde una clase tableViewController establezca su propia imagen de fondo. Si hago esto dentro de uno de mis TableViews (extendiendo UITableViewController ):

self.tableView.backgroundColor = backgroundColor;

Por supuesto, obtengo el color de fondo de tableView (que incidentalmente también colorea la celda, creo que la celda hereda su color de tableView ?) pero deseo tener una imagen de fondo estática que mis células se deslizan hacia arriba y hacia abajo. No es una `` imagen de fondo '' que se desliza hacia arriba y hacia abajo con los gestos de los usuarios. Exactamente lo que ofrece el TableView de GroupedStyle, pero en un TableView de PlainStyle :) .. y hecho usando código, no IB.

Supongo que tengo que borrar el color de fondo de la vista de tabla, luego establecer el color de las Celdas al configurarlas para que no se vuelvan transparentes. Y luego de alguna manera '' colarse '' una imagen de fondo debajo de la vista tableView desde el interior de la instancia tableView?

¿Cómo haré esto? La mejor solución sería poder hacer esto en viewDidLoad o cualquier otra función dentro de mi TableViewController, para mantener toda mi personalización en un solo lugar.

Espero que alguien pueda ayudarme, estoy 'googleado' :) ¡Gracias!

¿Fue útil?

Solución

Debe configurar su controlador como UIViewController , no como UITableViewController . A continuación, agregue la tableview programáticamente sobre un imageView de fondo.

@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

Otros consejos

Todo este salto a través de aros es innecesario si estás apuntando a > iOS 3.2, donde puede usar el nuevo propiedad backgroundView para establecer un UIImageView directamente, por ejemplo:

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

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

Ok, ahora se está ejecutando :) Mi tableView no estaba poblado con mis celdas, así que rompe el puntero a través de lo que descubrí que aunque había implementado TableViewDataSource y TableViewDelegate, esto solo estaba en la vista principal, necesitaba establecer el delegado y la fuente de datos de la vista de tabla en = self. Para otros que buscan una respuesta a esto, aquí está el método, ya que terminó con la ayuda 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;

}

Gracias Coneybeare.

Ya no se bloquea y la imagen de fondo resulta perfecta (junto con mi control de navegación en la parte superior) Sin embargo, todavía no hay tableView visible? solo la imagen de fondo y la barra de control de navegación:

Esta es mi implementación:

- (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, memoria ... etc.

El foro no estaba listo para un archivo .m completo de una vez. Dígame si omití algo que podría ayudar a indicar un error.

Pensé que tal vez era el orden de las capas y probé esto sin suerte:

    [self.view sendSubviewToBack:imageView];

Espero haber perdido algo obvio.

Gracias por su tiempo :)

Algunos consejos:

  • Si usa un UISplitViewController :

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

    navigationController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • Si usa un UISplitViewController y un UINavigationController :

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

Asegúrese de establecer el color de fondo de cualquier UIView que desee ver que esté encima del UINavigationController o UISplitViewController en < code> [UIColor clearColor] .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top