在UICollectionView上从右到左alignment

这是一个非常简单的问题,但是我一直没有find明确的答案(如果我错过了,请纠正我)。

基本上,我的问题是: 是否可以alignmentUICollectionView行内容从右到左,而不是从左到右?

在我的研究中,我已经看到了提示UICollectionViewFlowLayout子类UICollectionViewFlowLayout答案,但是我还没有find一个为右alignment创build的例子。

我的目标是设置2个收集视图,如下所示:

例

任何帮助是极大的赞赏!

您可以通过在集合视图上执行转换来获得相似的结果,并反转其内容:

首先在创buildUICollectionView时,我对它进行了水平翻转:

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

然后子类UICollectionViewCell和在这里做contentView相同的水平翻转:

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

没有做任何Xtransform到集合视图只是强制RTL

 YourCollectionView.semanticContentAttribute = UISemanticContentAttribute.forceRightToLeft 

从iOS 9开始,Collection Views支持根据此WWDCvideo的 RTL。 因此,不再需要创buildRTLstream布局(除非您已经使用自定义布局)。

select: 编辑scheme… > 选项 > 运行 > 应用程序语言 > 从右到左伪 语言

在这里输入图像说明

生成模拟器时,文本将右alignment,并且您的集合视图将按从右到左的顺序排列。

在这里输入图像说明

虽然有一个问题。 当contentOffset.x == 0 ,Collection View滚动位置位于Left边缘(错误)而不是Right边缘(正确)。 有关详细信息,请参阅这篇文章

一种解决方法是简单地将First项滚动到.Left (有一个问题 – .Left实际上是在右边Leading边缘):

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

在我的testing项目中,我的Collection View嵌套在Table View Cell中,所以我没有访问viewDidAppear() 。 所以相反,我结束了hook到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.numberOfItemsInSection(0) > 0 else { return } let indexPath = NSIndexPath(forItem: 0, inSection: 0) collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .Left, animated: false) } } 

要看到这个行动,请检查在这个git回购的RTL分支 。 对于上下文,请参阅此博客文章及其评论 。

在这里输入图像说明

对于任何试图在Swift中实现UICollectionView从右到左布局的UICollectionView

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