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