swift - 从右到左的水平集合视图从左到右显示不正确
swift - right to left horizontal collection view in displayed incorrectly from left to right
我正在从右到左显示一个水平的集合视图,遇到一个问题,当显示元素时,它们从末尾显示(而不是从左到右):
- 在运行架构选项中,应用程序语言设置为从右到左的伪语言
- 如果我是在之前启动应用程序时添加项目,而不是在之后添加项目并调用 reloadData,则不会出现问题
- 附上示例工程和截图
提出的一个解决方案是添加下面有效的代码,但需要我颠倒顺序才能添加项目。我想知道是否有更好的方法来做到这一点,并且也在 API 而不是使用覆盖扩展名
extension UICollectionViewFlowLayout {
open override var flipsHorizontallyInOppositeLayoutDirection: Bool {
return true
}
}
不胜感激
代码:
import UIKit
class HorizontalScrollTestViewController: UIViewController, UICollectionViewDataSource , CellDelegate{
var items = [String]()
@IBOutlet weak var collectionView: UICollectionView!
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ReusableCell", for: indexPath) as! CategoryCollectionViewCell
cell.category.setTitle(items[indexPath.row] , for: UIControl.State.normal)
cell.delegate = self
return cell
}
override func viewDidLoad() {
super.viewDidLoad()
let dispatchQueue = DispatchQueue(label: "resourcesQueue", qos: .background)
dispatchQueue.async {
self.addItems()
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
collectionView.dataSource = self
collectionView?.register(UINib(nibName: "CategoryCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "ReusableCell")
}
func buttonPressed(_ cell: UICollectionViewCell) {
if let row = self.collectionView.indexPath(for: cell)?.row {
print(items[row])
}
}
func addItems() {
self.items.append("test 10")
self.items.append("test 9")
self.items.append("test 8")
self.items.append("test 7")
self.items.append("test 6")
self.items.append("test 5")
self.items.append("test 4")
self.items.append("test 3")
self.items.append("test 2")
self.items.append("test 1")
}
}
在应用程序启动后添加项目并使用 reloadData 的示例:
预期行为
在这里,您只需水平翻转 collectionView
和 collectionViewCell
。这将解决您的问题。
有了这个你可以水平翻转你的collectionView。这样您的 collectionView 从右边开始。您的第一个元素将在右侧,最后一个元素将在左侧。
collectionView.transform = CGAffineTransform(scaleX: -1, y: 1)
或
collectionView.transform = CGAffineTransform(a: -1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0)
同样,你必须翻转每个 collectionViewCell
也使用
cell.transform = CGAffineTransform(scaleX: -1, y: 1)
或
cell.transform = CGAffineTransform(a: -1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0)
并按以下顺序在数组中添加元素
func addItems() {
self.items.append("test 1")
self.items.append("test 2")
self.items.append("test 3")
self.items.append("test 4")
self.items.append("test 5")
self.items.append("test 6")
self.items.append("test 7")
self.items.append("test 8")
self.items.append("test 9")
self.items.append("test 10")
}
从 Here
下载更新的项目
我正在从右到左显示一个水平的集合视图,遇到一个问题,当显示元素时,它们从末尾显示(而不是从左到右):
- 在运行架构选项中,应用程序语言设置为从右到左的伪语言
- 如果我是在之前启动应用程序时添加项目,而不是在之后添加项目并调用 reloadData,则不会出现问题
- 附上示例工程和截图
提出的一个解决方案是添加下面有效的代码,但需要我颠倒顺序才能添加项目。我想知道是否有更好的方法来做到这一点,并且也在 API 而不是使用覆盖扩展名
extension UICollectionViewFlowLayout {
open override var flipsHorizontallyInOppositeLayoutDirection: Bool {
return true
}
}
不胜感激
代码:
import UIKit
class HorizontalScrollTestViewController: UIViewController, UICollectionViewDataSource , CellDelegate{
var items = [String]()
@IBOutlet weak var collectionView: UICollectionView!
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ReusableCell", for: indexPath) as! CategoryCollectionViewCell
cell.category.setTitle(items[indexPath.row] , for: UIControl.State.normal)
cell.delegate = self
return cell
}
override func viewDidLoad() {
super.viewDidLoad()
let dispatchQueue = DispatchQueue(label: "resourcesQueue", qos: .background)
dispatchQueue.async {
self.addItems()
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
collectionView.dataSource = self
collectionView?.register(UINib(nibName: "CategoryCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "ReusableCell")
}
func buttonPressed(_ cell: UICollectionViewCell) {
if let row = self.collectionView.indexPath(for: cell)?.row {
print(items[row])
}
}
func addItems() {
self.items.append("test 10")
self.items.append("test 9")
self.items.append("test 8")
self.items.append("test 7")
self.items.append("test 6")
self.items.append("test 5")
self.items.append("test 4")
self.items.append("test 3")
self.items.append("test 2")
self.items.append("test 1")
}
}
在应用程序启动后添加项目并使用 reloadData 的示例:
预期行为
在这里,您只需水平翻转 collectionView
和 collectionViewCell
。这将解决您的问题。
有了这个你可以水平翻转你的collectionView。这样您的 collectionView 从右边开始。您的第一个元素将在右侧,最后一个元素将在左侧。
collectionView.transform = CGAffineTransform(scaleX: -1, y: 1)
或
collectionView.transform = CGAffineTransform(a: -1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0)
同样,你必须翻转每个 collectionViewCell
也使用
cell.transform = CGAffineTransform(scaleX: -1, y: 1)
或
cell.transform = CGAffineTransform(a: -1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0)
并按以下顺序在数组中添加元素
func addItems() {
self.items.append("test 1")
self.items.append("test 2")
self.items.append("test 3")
self.items.append("test 4")
self.items.append("test 5")
self.items.append("test 6")
self.items.append("test 7")
self.items.append("test 8")
self.items.append("test 9")
self.items.append("test 10")
}
从 Here
下载更新的项目