2016-11-02 375 views

回答

2

在尋找任何可能的內置功能後,我遇到了同樣的問題,讓我能夠輕鬆完成這一任務 - 不幸的是,我找不到這樣的事情。我有我的自我做這種伎倆來解決這個問題:

出於演示的目的,我將在本-ugly-的CollectionView,並告訴你應該如何變化:

enter image description here

訣竅的主要思想是鏡像!將scaleX更改爲-1。

讓我們的鏡子全收觀點:

P.S:斯威夫特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

希望它幫助。

+0

很酷:)不優雅的方式...但我留下深刻的印象:) –

+0

這是正確的這不是一個優雅的方式,但至少可以解決它的問題!正如我所提到的,我找不到更好的方法來做到這一點...... –

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只需要給它。

1

實現這一目標最簡單的方法是改變集合視圖semanticContentAttribute枚舉實例屬性的值:

的視圖的內容,用來確定 的語義描述是否認爲應該翻轉當在從左到右和從右到左佈局的 之間切換時。

通過設置到.forceRightToLeft,如下:

// 'viewDidLoad' would be a proper method to do it: 
override func viewDidLoad() { 
    // ... 

    collectionVIew.semanticContentAttribute = .forceRightToLeft 

    // ... 
}