答案 0 :(得分:2)
我遇到了同样的问题,在搜索了任何可能让我能够轻松完成此功能的内置功能之后 - 不幸的是 - 我找不到这样的东西。我不得不通过这个技巧来解决它:
为了演示,我将展示这个-ugly- collectionView并告诉你它应该如何改变:
这个技巧的主要思想是镜像!,将scaleX更改为-1。
让我们镜像整个集合视图:
P.S:Swift 3代码。
如果您没有为您的collectionView设置IBOutlet,请创建一个。在我的情况下,我称之为collectionView
在viewController中:
override func viewDidLoad() {
super.viewDidLoad()
collectionView.transform = CGAffineTransform(scaleX: -1, y: 1)
}
现在,它应该是这样的:
“到底是什么?!”
到目前为止一切顺利,实际上这正是您所寻找的,但您仍然需要为每个单元格内容添加另一种镜像机制。
在自定义单元格的类中:
override func awakeFromNib() {
super.awakeFromNib()
contentView.transform = CGAffineTransform(scaleX: -1, y: 1)
}
现在看起来应该是这样的:
希望它有所帮助。
答案 1 :(得分:2)
实现它的最简单方法是更改集合视图semanticContentAttribute
枚举实例属性的值:
视图内容的语义描述,用于确定 切换时是否应该翻转视图 从左到右和从右到左的布局。
设置为.forceRightToLeft
,如下所示:
// 'viewDidLoad' would be a proper method to do it:
override func viewDidLoad() {
// ...
collectionVIew.semanticContentAttribute = .forceRightToLeft
// ...
}
答案 2 :(得分:1)
另一个解决方案是子类UICollectionViewFlowLayout
并像这样实现它:
class CustomFlowLayout: UICollectionViewFlowLayout {
//MARK: - Private
private func reversedRect(for rect: CGRect) -> CGRect {
let point = reversedPoint(for: rect.origin)
let newPoint = CGPoint(x: point.x - rect.size.width, y: point.y)
return CGRect(x: newPoint.x, y: newPoint.y, width: rect.size.width, height: rect.size.height)
}
private func reversedPoint(for point: CGPoint) -> CGPoint {
return CGPoint(x: collectionViewContentSize.width - point.x, y: point.y)
}
//MARK: - Overridden
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let attributes = super.layoutAttributesForElements(in: reversedRect(for: rect)) else {
return nil
}
for attribute in attributes {
attribute.center = reversedPoint(for: attribute.center)
}
return attributes
}
}
只需在Interface Builder中分配即可。