Horizontal UITableView

Quiero implementar un diseño en mi aplicación ipad que tenga una vista útil que se desplace hacia la izquierda y la derecha en lugar de hacia arriba y hacia abajo:

Entonces, en lugar de

fila 1 fila 2 fila 3 (desplazamiento vertical) Sería: fila 1, fila 2, fila 3 (desplazamiento horizontal)

He visto que UItableView está diseñado para hacer solo el desplazamiento vertical, por lo que hacer una transformación no da el efecto deseado. ¿Existe una forma estándar de hacerlo aprovechando un proveedor de fonts de datos como lo proporciona uitableview?
Básicamente quiero hacer algo similar a lo que hace la aplicación de lectores de BBC News en el Ipad con la lista de historias para seleccionar.

Gracias

He publicado un código de muestra que demuestra un enfoque para implementar vistas de tabla de desplazamiento horizontal utilizando transformadas. Se llama EasyTableView y proporciona la misma interfaz para vistas de tablas de desplazamiento vertical y horizontal.

Este es el método que uso:

1) Implemente su propia subclase de UITableView y anule su método initWithCoder: como se muestra a continuación:

 - (id)initWithCoder:(NSCoder *)aDecoder { assert([aDecoder isKindOfClass:[NSCoder class]]); self = [super initWithCoder:aDecoder]; if (self) { const CGFloat k90DegreesCounterClockwiseAngle = (CGFloat) -(90 * M_PI / 180.0); CGRect frame = self.frame; self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesCounterClockwiseAngle); self.frame = frame; } assert(self); return self; } 

2) Cree su propia clase UITableViewCell y anule initWithCoder: nuevamente:

 - (id)initWithCoder:(NSCoder *)aDecoder { assert([aDecoder isKindOfClass:[NSCoder class]]); self = [super initWithCoder:aDecoder]; if (self) { const CGFloat k90DegreesClockwiseAngle = (CGFloat) (90 * M_PI / 180.0); self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesClockwiseAngle); } assert(self); return self; } 

3) Ahora puede crear un elemento UITableView en IB y configurar su clase para que sea “MyHorizontalTableView” en el inspector de identidad.

4) Cree su elemento UITableViewCell en IB y configure su clase para que sea “MyHorizontalTableViewCell” en el inspector de identidad.

Y eso es.

Esto funcionaría anulando otros inicializadores también en caso de que prefiera no usar IB para instanciar su vista de tabla o celda.

Un proyecto de ejemplo que construí alrededor de este concepto se puede encontrar en GitHub.

Si puede restringir su aplicación solo a iOS 6 y posteriores, la mejor manera de hacerlo es con UICollectionView .

Si necesita admitir iOS 4/5, intente con una de las reimplementaciones de código abierto de UICollectionView, por ej. PSTCollectionView

Esta pregunta ha sido respondida por Apple . Desplazamiento por manzana

Demuestra cómo implementar dos UIScrollViews de estilo diferente. La primera barra de desplazamiento contiene múltiples imágenes, que muestran cómo diseñar un gran contenido con múltiples fragmentos de datos (en nuestro caso 5 UIImageViews separados).

esto funciona para iPad también.

Por ahora, debe usar UIScrollView y establecer el desplazamiento solo en horizontal. En cuanto a los datos, usted necesita manejar el dequeing y las optimizaciones usted mismo. Si no espera más de una docena de objetos, entonces probablemente pueda omitirlos, pero si son intensivos en datos, intente implementar un origen de datos similar y cargarlo como lo hace UITableView. Tenga en cuenta que la aplicación de lectores de BBC News también utiliza la función de búsqueda activada para desplazarse por cada ‘página (aproximadamente 4 íconos de noticias)’.

Escribí una subclase simple UIScrollView que al igual que UITableView implementa la reutilización de la celda, el proyecto MMHorizontalListView está en gitHub, también hay un proyecto de prueba, así que puedes ver cómo usarlo con un ejemplo, también funciona con versiones anteriores de iOS como 4.x (Probablemente incluso más viejo …)

Hay un simple y shiny truco para lograr que UITableView funcione perfectamente tanto en desplazamiento vertical como horizontal.

Puedes hacerlo tanto con y sin autolayout: lo explicaré con autolayout.

En usted, UITableView tiene una restricción de ancho y ninguna restricción de alineación de cola. Vincular esta restricción de ancho con una IBOutlet y en su controlador establecer lo siguiente para las propiedades en la vista de tabla.

 let contentWidth = 1000 // you calculate that tableViewWidthConstraint.constant = contentWidth tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width 

La vista de tabla debe ser de ancho completo para representar todo el contenido en la dirección horizontal, y la que tocamos con el tamaño del contenido en comparación con el tamaño de la pantalla que hace el truco.

Las siguientes ubicaciones debajo de ellas funcionan, pero puede intentarlo en diferentes pasos en el ciclo de vida:

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tableViewWidthConstraint.constant = contentWidth } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width } // and this is needed to support rotation: override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) -> Void in self.tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width }, completion: nil) } super.viewWillTransition(to: size, with: coordinator) }