在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)