2009-10-28 11 views
7

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? edificio Im mi TableViews totalmente en código, como esto:iPhone UITableView PlainStyle con imagen de fondo personalizada - hecho "completamente" en el código

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

La ventana es mi principal UIWindow acumulación para mí en el delegado de la aplicación. A partir de ahora necesito construir unos pocos TableViews diferentes (controlados por navigationController), algunos con fetchedResultsControllers, celdas personalizadas y más. Prefiero hacer esto completamente en código, sin usar plumillas, ya que esto daría lugar a que la personalización se extienda entre el código y el IB o que tenga que crear y mantener más de 6 nib.

Simplemente no puedo encontrar un ejemplo en el que una clase tableViewController establezca su propia imagen de fondo. Si hago esto dentro de una de mis TableViews (que se extiende UITableViewController):

self.tableView.backgroundColor = backgroundColor; 

Yo, por supuesto, obtener los antecedentes del tableView de color (los colores que dicho sea de paso del así la célula, pensar de la célula hereda el color de la tableView?) pero deseo tener una imagen de fondo estática sobre la cual mis celdas se deslizan arriba y abajo encima. No es una "imagen de fondo" que se desliza hacia arriba y hacia abajo con los gestos de los usuarios. Exactamente lo que ofrece 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 "escabullir" una imagen de fondo debajo de la vista tableView desde dentro de la instancia de tableView?

Como voy a hacer 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 me puede ayudar, estoy todo en 'Google' :) ¡Gracias!

Respuesta

9

Debe configurar su controlador como UIViewController, no como UITableViewController. A continuación, agregue el tableview programáticamente sobre un fondo 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 
+0

Gracias Coneybeare, esto parece seguir la lógica que he visto en Semillas que incorporan una imagen personalizada, construir vista genérica, poner imageview y una tableView su interior. Obtengo un comportamiento extraño:/ Implementé cellForRowAtIndexPath: y también tiene una variable local llamada "tableView". Esto provoca que el compilador advierta "la declaración local de 'tableView' oculta la variable de instancia". Luego intenté cambiar el nombre de la variable a tableViewLocal, pero la advertencia persiste. -continue ... – RickiG

+2

También al cargar la vista (como se describe en mi pregunta) se cuelga cuando agrego el [self.tableView addSubview: self.tableView]; No se supone que es: [self.view addSubview: self.tableView]; esto compila y funciona, pero solo está la imagen de fondo, ¿no hay tablas? Creo que el enfoque es sólido, pero hay algo que me falta :) Thans nuevamente :) – RickiG

+0

Cambiaría todos los argumentos "tableView" en las firmas de métodos para ser theTableView, y dejar self.tableView como está. El fallo fue un error tipográfico de mi parte, debería haber sido self.view add ... (corregido ahora) – coneybeare

0

Gracias Coneybeare.

No se cuelga más y la imagen de fondo aparece perfecta (junto con mi navigationController en la parte superior) Sin embargo, ¿todavía no hay tableView visible?sólo la imagen de fondo y el navigationControllerBar:

Ésta es mi aplicació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; 

}

// cometer edición, didSelectRow, la memoria ... etc

El foro no estaba a la totalidad de un archivo .m de una sola vez. Por favor, dígame si dejaba algo que podría ayudar a indicar un error.

pensé que tal vez era el orden de las capas y trataron esto sin un poco de suerte:

[self.view sendSubviewToBack:imageView]; 

Esperanza me haya perdido algo obvio.

Gracias por su tiempo :)

+0

Acaba de recibir :) self.tableView = [[[UIView alloc] initWithFrame: self.view.bounds] autorelease]; debe ser: self.tableView = [[[UITableView alloc] initWithFrame: self.view.bounds] liberación automática]; De lo contrario, no "calzará" :) ¡Gracias de nuevo! – RickiG

2

Ok, ahora se está ejecutando :) Mi tableView no se rellenaba con mis células, por lo que a través breakPointing lo descubrí que a pesar de que había implementado el TableViewDataSource y TableViewDelegate, esto era sólo en la vista principal, que necesitaba para establecer el delegado y la fuente de datos de la tableview a = auto. Para otros que buscan una respuesta a esto aquí es el método, ya que terminó con Coneybeares ayuda:

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

}

0

Algunos consejos:

  • Si se utiliza un UISplitViewController:

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

    navigationController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor]; 
    
  • Si se utiliza tanto un UISplitViewController y una UINavigationController:

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

Asegúrese de ajustar el color de fondo de cualquier UIView desea ver a través de lo que está en la parte superior de la UINavigationController o UISplitViewController-[UIColor clearColor].

6

Todo esto saltando por los aro es innecesario si está orientando a> iOS 3.2, donde puede usar la nueva propiedad backgroundView para establecer un UIImageView directamente, p.:

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

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