uicollectionviewcontroller ios objective-c uicollectionview right-to-left uicollectionviewlayout

ios - uicollectionviewcontroller - uicollectionviewcell indexpath



AlineaciĆ³n de derecha a izquierda en UICollectionView (6)

A partir de iOS 9, las Vistas de Colección admiten RTL de acuerdo con este video WWDC . Por lo tanto, ya no es necesario crear un diseño de flujo RTL (a menos que ya esté usando un diseño personalizado).

Seleccione: Editar esquema ... > Opciones > Ejecutar > Idioma de la aplicación > Pseudolenguaje de derecha a izquierda

Cuando construya en Simulator, el texto se alineará a la derecha, y su vista de colección se ordenará de derecha a izquierda.

Sin embargo, hay un problema. Cuando contentOffset.x == 0 , la posición de desplazamiento de la vista de contentOffset.x == 0 está en el borde Left (incorrecto) en lugar del borde Right (correcto). Ver este artículo de la pila para más detalles.

Una solución consiste simplemente en desplazar el First elemento hacia el .Left (Hay un gotcha - .Left está realmente a la derecha , o al borde anterior):

override func viewDidAppear(animated: Bool) { if collectionView?.numberOfItemsInSection(0) > 0 { let indexPath = NSIndexPath(forItem: 0, inSection: 0) collectionView?.scrollToItemAtIndexPath(indexPath, atScrollPosition: .Left, animated: false) } }

En mi proyecto de prueba, mi vista de colección estaba anidada dentro de una celda de vista de tabla, por lo que no tenía acceso a viewDidAppear() . Entonces, en cambio, terminé enganchándome en drawRect() :

class CategoryRow : UITableViewCell { @IBOutlet weak var collectionView: UICollectionView! override func drawRect(rect: CGRect) { super.drawRect(rect) scrollToBeginning() } override func prepareForReuse() { scrollToBeginning() } func scrollToBeginning() { guard collectionView.numberOfItems(inSection: 0) > 0 else { return } let indexPath = IndexPath(item: 0, section: 0) collectionView.scrollToItem(at: indexPath, at: .left, animated: false) } }

Para ver esto en acción, revisa la rama de RTL en este git repo . Y para el contexto, vea esta publicación en el blog y sus comentarios .

esta es una pregunta bastante sencilla, pero no he podido encontrar una respuesta definitiva en SO (si me la perdí, por favor corrígeme).

Básicamente, mi pregunta es: ¿es posible alinear los contenidos de la fila UICollectionView de derecha a izquierda en lugar de alinearlos de izquierda a derecha?

En mi investigación, he visto respuestas que sugieren subclassing UICollectionViewFlowLayout , pero no he podido encontrar un ejemplo donde se creó uno para la alineación a la derecha.

Mi objetivo es tener 2 vistas de colección configuradas así:

¡Cualquier ayuda es muy apreciada!


Además de la respuesta de Tawfik:

También puede configurar la propiedad Semantic de UICollectionView a través de Interface Builder:

Más sobre esta propiedad: en esta pregunta


Para cualquiera que intente lograr el diseño de derecha a izquierda de UICollectionView en Swift

//in viewDidLoad YourCollectionView.transform = CGAffineTransform(scaleX: -1.0, y: 1.0) //in cellForItemAtIndexPath cell.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)


Para cualquiera que tenga la misma pregunta:

Terminé usando la biblioteca UICollectionViewRightAlignedLayout que se recomienda @ chinttu-roxen-ramani. Puede configurarlo con el código:

self.collectionView.collectionViewLayout = [[UICollectionViewRightAlignedLayout alloc] init];

o a través del constructor de interfaz:

Terminé haciendo un par de modificaciones a la biblioteca, pero en general funciona muy bien.


Puede obtener resultados similares al realizar una transformación en la vista de colección e invertir el salto en su contenido:

Primero, al crear el UICollectionView, realicé un salto horizontal en él:

[collectionView_ setTransform:CGAffineTransformMakeScale(-1, 1)];

Luego subclase UICollectionViewCell y aquí haga el mismo salto horizontal en su contentView:

[self.contentView setTransform:CGAffineTransformMakeScale(-1, 1)];


Sin hacer ningún Xtransform a la vista de colección, simplemente forzó RTL:

YourCollectionView.semanticContentAttribute = UISemanticContentAttribute.forceRightToLeft