iOS UICollectionView - 默认流程,从右到左填充行

时间:2013-10-31 16:44:42

标签: ios iphone objective-c uicollectionview uicollectionviewlayout

我在我的一个应用程序UICollectionView中使用,具有自定义单元格但具有默认流程。 目前,该视图连续显示3个单元格(所有单元格大小相同)。单元格从左到右填充行,但我需要从右到左。

有可能吗?我是否需要创建自定义流程布局?如果是这样,任何人都可以给出一个简单的例子吗?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

由于阿拉伯语的翻译,我有同样的问题。

这是我的解决方案: 创建UICollectionViewFlowLayout的子类并覆盖

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect:

我使用NSLocales字符方向作为RTL转换的触发器。如果它是LTR语言,它只返回默认属性。

希望它有用。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray *supersAttributes = [super layoutAttributesForElementsInRect:rect];
    NSLocale *currentLocale = ((NSLocale *) [NSLocale currentLocale]);
    NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLanguage:currentLocale.localeIdentifier];

    // if it's an RTL language: change the frame
    if (direction == NSLocaleLanguageDirectionRightToLeft) {
        for (UICollectionViewLayoutAttributes *attributes in supersAttributes) {
            CGRect frame = attributes.frame;
            frame.origin.x = rect.size.width - attributes.frame.size.width - attributes.frame.origin.x;
            attributes.frame = frame;
        }
    }
    return supersAttributes;
}

答案 1 :(得分:0)

@implementation CollectionReversedLayout
- (void)reverseLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes {
     CGPoint newCenter = attributes.center;
     newCenter.x = self.collectionViewContentSize.width - newCenter.x;
     attributes.center = newCenter;
     return attributes;
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray *s = [super layoutAttributesForElementsInRect:rect];
    for (UICollectionViewLayoutAttributes *attributes in s) {
        [self reverseLayoutAttributes:attributes];
    }
    return s;
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewLayoutAttributes *s = [super layoutAttributesForItemAtIndexPath:indexPath];
    [self reverseLayoutAttributes:s];
    return s;
}