Estoy intentando crear exactamente el mismo efecto que en la aplicación AppStore para ver capturas de pantalla: dentro de una UITableView, tengo subclases personalizadas de UITableViewCell. Uno de ellos está diseñado para mostrar vistas previas de algunos productos, digamos 4 imágenes. Quiero que se muestren de la misma manera que AppStore presenta capturas de pantalla de una aplicación: dentro de UIScrollView horizontal con su UIPageControl adjunto.Horizontal UIScrollView dentro de una UITableViewCell
Así que añadir mi UIScrollView y mi UIPageControl a mi UITableViewCell, al igual que:
@implementation phVolumePreviewCell
- (id)init {
if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kVolumePreviewCellIdentifier]) {
[self setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
[self setSelectionStyle:UITableViewCellSeparatorStyleNone];
previews = [[NSMutableArray alloc] initWithCapacity:4];
for (int i = 0; i < 4; i++) {
[previews addObject:@"dummy"];
}
scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero];
[scrollView setPagingEnabled:YES];
[scrollView setBackgroundColor:[UIColor grayColor]];
[scrollView setIndicatorStyle:UIScrollViewIndicatorStyleBlack];
[scrollView setShowsHorizontalScrollIndicator:YES];
[scrollView setBounces:YES];
[scrollView setScrollEnabled:YES];
[scrollView setDelegate:self];
[self.contentView addSubview:scrollView];
[scrollView release];
pageControl = [[UIPageControl alloc] initWithFrame:CGRectZero];
[pageControl setNumberOfPages:[previews count]];
[pageControl setBackgroundColor:[UIColor grayColor]];
[self.contentView addSubview:pageControl];
[pageControl release];
}
return self;
}
(nota: estoy poblando "vistas previas" con datos ficticios aquí, sólo con el fin de tener un [vistas previas conteo] que funciona; quiero ver el indicador de desplazamiento de scrollView solo para fines de prueba, los esconderé más adelante).
Mi problema es que puedo desplazar todo el UITableView que contiene este phVolumePreviewCell (subclase de UITableViewCell), pero no puedo desplazar el UIScrollView. ¿Cómo puedo conseguir esto?
La única información que encontré está allí: http://theexciter.com/articles/touches-and-uiscrollview-inside-a-uitableview.html Pero habla de viejos SDK (a saber, 2.2) y estoy seguro de que hay un enfoque más "reciente" para hacer esto.
Algunas precisiones:
- que puede desplazarse por el UIScrollView con dos dedos. Eso no es lo que quiero, quiero que se pueda desplazar solo con un dedo.
- Cuando me desplazo con dos dedos, el TableView aún intercepta los toques y se desplaza un poco hacia arriba o hacia abajo. Me gustaría que el TableView se quede en su posición cuando toco el ScrollView.
Creo que tengo que encontrar la manera de interceptar toques en mi TableView, y si el contacto está en la phVolumePreviewCell (personalizado UITableViewCell subclase), pasarlo a la celda en lugar de manejarlo en el TableView.
Para el registro, mi TableView se crea mediante programación en una subclase UITableViewController:
@interface phVolumeController : UITableViewController <UITableViewDelegate> {
LocalLibrary *lib;
NSString *volumeID;
LLVolume *volume;
}
- (id)initWithLibrary:(LocalLibrary *)newLib andVolumeID:(NSString *)newVolumeID;
@end
@implementation phVolumeController
#pragma mark -
#pragma mark Initialization
- (id)initWithLibrary:(LocalLibrary *)newLib andVolumeID:(NSString *)newVolumeID {
if (self = [super initWithStyle:UITableViewStylePlain]) {
lib = [newLib retain];
volumeID = newVolumeID;
volume = [(LLVolume *)[LLVolume alloc] initFromLibrary:lib forID:volumeID];
[[self navigationItem] setTitle:[volume title]];
}
return self;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kVolumePreviewCellIdentifier];
if (cell == nil) {
cell = [[[phVolumePreviewCell alloc] init] autorelease];
}
[(phVolumePreviewCell *)cell setVolume:volume];
return (UITableViewCell *)cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return kVolumePreviewCellHeight;
}
Gracias por cualquier ayuda!
Gracias Cyrille !! El mismo problema aqui. ¡Tu solución me ahorró muchas horas de desesperación! :-) –
Hola, Cyrille: sé que esta es una vieja pregunta de SO, pero me preguntaba si tendrías una aplicación de muestra para esta solución. Gracias .. – Craig
@Craig: no hay aplicación de muestra, lo siento. Este código ha evolucionado desde entonces y ya no lo uso. Pero realmente, todo el código que necesita para reproducir esta situación está aquí en mis publicaciones. – Cyrille