如何从右到左而不是从左到右显示UICollectionView的单元格?

时间:2016-11-02 21:41:31

标签: ios swift uicollectionview

这就是我现在所拥有的(默认):

enter image description here

但我希望:

enter image description here

我使用NSFetcheResultsController以我的财产的降序显示它。

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,在搜索了任何可能让我能够轻松完成此功能的内置功能之后 - 不幸的是 - 我找不到这样的东西。我不得不通过这个技巧来解决它:

为了演示,我将展示这个-ugly- collectionView并告诉你它应该如何改变:

enter image description here

这个技巧的主要思想是镜像!,将scaleX更改为-1。

让我们镜像整个集合视图:

P.S:Swift 3代码。

如果您没有为您的collectionView设置IBOutlet,请创建一个。在我的情况下,我称之为collectionView

在viewController中:

override func viewDidLoad() {
    super.viewDidLoad()

    collectionView.transform = CGAffineTransform(scaleX: -1, y: 1)
}

现在,它应该是这样的:

enter image description here

“到底是什么?!”

到目前为止一切顺利,实际上这正是您所寻找的,但您仍然需要为每个单元格内容添加另一种镜像机制。

在自定义单元格的类中:

override func awakeFromNib() {
    super.awakeFromNib()

    contentView.transform = CGAffineTransform(scaleX: -1, y: 1)
}

现在看起来应该是这样的:

enter image description here

希望它有所帮助。

答案 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中分配即可。