Circular UICollectionview, cómo mantener todos los angularjs de celda 0 °

Construyo una circular UICollectionview siguiendo esta guía, Todo funciona como se esperaba pero no quiero que los elementos giren alnetworkingedor de su propio ángulo / ancla

La fila superior es la forma en que funciona mi colección circular en este momento, el dibujo inferior es cómo me gustaría ver mi colección:

Diseño

Estoy usando el siguiente código de atributo de layout:

class CircularCollectionViewLayoutAttributes: UICollectionViewLayoutAttributes { var anchorPoint = CGPoint(x: 0.3, y: 0.5) var angle: CGFloat = 0 { didSet { zIndex = Int(angle*1000000) transform = CGAffineTransformMakeRotation(angle) } } override func copyWithZone(zone: NSZone) -> AnyObject { let copiedAttributes: CircularCollectionViewLayoutAttributes = super.copyWithZone(zone) as! CircularCollectionViewLayoutAttributes copiedAttributes.anchorPoint = self.anchorPoint copiedAttributes.angle = self.angle return copiedAttributes } } 

con la siguiente class de layout:

 class CircularCollectionViewLayout: UICollectionViewLayout { let itemSize = CGSize(width: 60, height: 110) var angleAtExtreme: CGFloat { return collectionView!.numberOfItemsInSection(0) > 0 ? -CGFloat(collectionView!.numberOfItemsInSection(0)-1)*anglePerItem : 0 } var angle: CGFloat { return angleAtExtreme*collectionView!.contentOffset.x/(collectionViewContentSize().width - CGRectGetWidth(collectionView!.bounds)) } var radius: CGFloat = 400 { didSet { invalidateLayout() } } var anglePerItem: CGFloat { return 0.18 } var attributesList = [CircularCollectionViewLayoutAttributes]() override func collectionViewContentSize() -> CGSize { return CGSize(width: CGFloat(collectionView!.numberOfItemsInSection(0))*itemSize.width, height: CGRectGetHeight(collectionView!.bounds)) } override class func layoutAttributesClass() -> AnyClass { return CircularCollectionViewLayoutAttributes.self } override func prepareLayout() { super.prepareLayout() let centerX = collectionView!.contentOffset.x + (CGRectGetWidth(collectionView!.bounds)/2.0) let anchorPointY = ((itemSize.height/2.0) + radius)/itemSize.height let theta = atan2(CGRectGetWidth(collectionView!.bounds)/2.0, radius + (itemSize.height/2.0) - (CGRectGetHeight(collectionView!.bounds)/2.0)) //1 //let theta:CGFloat = 1.0 var startIndex = 0 var endIndex = collectionView!.numberOfItemsInSection(0) - 1 if (angle < -theta) { startIndex = Int(floor((-theta - angle)/anglePerItem)) } endIndex = min(endIndex, Int(ceil((theta - angle)/anglePerItem))) if (endIndex < startIndex) { endIndex = 0 startIndex = 0 } attributesList = (startIndex...endIndex).map { (i) -> CircularCollectionViewLayoutAttributes in let attributes = CircularCollectionViewLayoutAttributes(forCellWithIndexPath: NSIndexPath(forItem: i, inSection: 0)) attributes.size = self.itemSize attributes.center = CGPoint(x: centerX, y: CGRectGetMidY(self.collectionView!.bounds)) attributes.angle = self.angle + (self.anglePerItem*CGFloat(i)) attributes.anchorPoint = CGPoint(x: 0.5, y: anchorPointY) return attributes } } override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? { return attributesList } override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> (UICollectionViewLayoutAttributes!) { return attributesList[indexPath.row] } override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { return true } override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint { var finalContentOffset = proposedContentOffset let factor = -angleAtExtreme/(collectionViewContentSize().width - CGRectGetWidth(collectionView!.bounds)) let proposedAngle = proposedContentOffset.x*factor let ratio = proposedAngle/anglePerItem var multiplier: CGFloat if (velocity.x > 0) { multiplier = ceil(ratio) } else if (velocity.x < 0) { multiplier = floor(ratio) } else { multiplier = round(ratio) } finalContentOffset.x = multiplier*anglePerItem/factor return finalContentOffset } } 

Probé muchas cosas, pero no pude cambiar la rotation celular.

He resuelto este problema girando la vista de la celda por ángulo negativo:

Código a continuación:

  override func applyLayoutAttributes(layoutAttributes: UICollectionViewLayoutAttributes!) { super.applyLayoutAttributes(layoutAttributes) let circularlayoutAttributes = layoutAttributes as! CircularCollectionViewLayoutAttributes self.layer.anchorPoint = circularlayoutAttributes.anchorPoint viewRoot.transform = CGAffineTransformMakeRotation(-circularlayoutAttributes.angle) self.center.y += (circularlayoutAttributes.anchorPoint.y - 0.5) * CGRectGetHeight(self.bounds) }