Apple使用RTL语言时自动翻转界面的新功能似乎在使用UICollectionView
时会出现问题。
我在集合视图中使用了Trailing / Leading类型的约束,并且他们在RTL语言中切换了它们的值。
问题是实际呈现的数据属于集合数据源中的最后 indexPath
,但第一个单元格的UIScrollView.contentOffset.x
为0。
正确的行为可能是以下之一:
indexPath
并切换滚动方向(向右) - 最佳选项indexPath
/ scrollView.contentOffset.x
- 禁用RTL支持的选项。scrollView.contentOffset.x
以表示最后一个单元格位置。我猜Apple可能会在将来的某个时候修复它,但同时我们必须使用诸如反转数组和/或滚动到最后一个对象的变通方法。
答案 0 :(得分:10)
我处于类似的情况,并为此找到了解决方案。如果您使用的是swift,请将以下代码段添加到项目中,并确保bounds.origin始终遵循集合视图的前沿。
extension UICollectionViewFlowLayout {
open override var flipsHorizontallyInOppositeLayoutDirection: Bool {
return true
}
}
如果您使用的是Objective-C,则只需继承UICollectionViewLayout类,并覆盖flipsHorizontallyInOppositeLayoutDirection,并返回true。使用此子类作为集合视图的布局对象。
答案 1 :(得分:1)
我来晚了,但是如果您不想创建扩展程序,因为它会影响我们应用程序中所有的View视图。只需创建自己的自定义类即可。
class customLayoutForLocalization : UICollectionViewFlowLayout{
open override var flipsHorizontallyInOppositeLayoutDirection: Bool {
return true
} }
是
答案 2 :(得分:0)
这个问题的一个常见解决方案对我有用,请按照以下步骤来克服该问题,
答案 3 :(得分:0)
import UIKit
extension UICollectionViewFlowLayout {
open override var flipsHorizontallyInOppositeLayoutDirection: Bool {
return UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft
}
答案 4 :(得分:0)
虽然简单的数学就能解决问题,但这还不算很漂亮。 (用于水平collectionview)
- (void)switchSemanticDirection:(UISwitch*)sender {
//TEST switch the semantic direction between LTR and RTL.
if (sender.isOn) {
UIView.appearance.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight;
} else {
UIView.appearance.semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;
}
[self.myContent removeFromSuperview];
[self.view addSubview:self.myContent];
//reload your collection view to apply RTL setting programmatically
[self.list reloadData];
//position your content into the right offset after flipped RTL
self.list.contentOffset = CGPointMake(self.list.contentSize.width - self.list.contentOffset.x - self.list.bounds.size.width,
self.list.contentOffset.y);
}