带有RTL语言的项目上的UICollectionView iOS 9问题支持

时间:2015-10-14 16:08:01

标签: ios autolayout uicollectionview ios9 right-to-left

Apple使用RTL语言时自动翻转界面的新功能似乎在使用UICollectionView时会出现问题。

我在集合视图中使用了Trailing / Leading类型的约束,并且他们在RTL语言中切换了它们的值。

问题是实际呈现的数据属于集合数据源中的最后 indexPath,但第一个单元格的UIScrollView.contentOffset.x为0。

正确的行为可能是以下之一:

  1. 正确显示第一个indexPath并切换滚动方向(向右) - 最佳选项
  2. 不会翻转UI /约束,因此会显示所呈现的数据/ indexPath / scrollView.contentOffset.x - 禁用RTL支持的选项。
  3. 显示最后一个indexPath的单元格和数据,但修复scrollView.contentOffset.x以表示最后一个单元格位置。
  4. 我猜Apple可能会在将来的某个时候修复它,但同时我们必须使用诸如反转数组和/或滚动到最后一个对象的变通方法。

5 个答案:

答案 0 :(得分:10)

我处于类似的情况,并为此找到了解决方案。如果您使用的是swift,请将以下代码段添加到项目中,并确保bounds.origin始终遵循集合视图的前沿。

extension UICollectionViewFlowLayout {

    open override var flipsHorizontallyInOppositeLayoutDirection: Bool {
        return true
    }
}

如果您使用的是Objective-C,则只需继承UICollectionViewLayout类,并覆盖flipsHorizo​​ntallyInOppositeLayoutDirection,并返回true。使用此子类作为集合视图的布局对象。

答案 1 :(得分:1)

我来晚了,但是如果您不想创建扩展程序,因为它会影响我们应用程序中所有的View视图。只需创建自己的自定义类即可。

class customLayoutForLocalization : UICollectionViewFlowLayout{
open override var flipsHorizontallyInOppositeLayoutDirection: Bool {
    return true
} }

答案 2 :(得分:0)

这个问题的一个常见解决方案对我有用,请按照以下步骤来克服该问题,

  • 根据您的要求提供自动布局约束,然后从属性检查器将集合视图的语义控制属性更改为从故事板从右向左强制。

enter image description here

  • 然后打开故事板作为源代码,找到相关集合视图的“前导”属性,并将其替换为“左”,将“尾随”替换为“右”,将其替换为“右”。现在你快完成了。

enter image description here

enter image description here

enter image description here

  • 现在可根据您的要求为您提供结果。

答案 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);
}