Asa*_*saf 11 iphone objective-c ios uicollectionview uicollectionviewlayout
我在我的一个应用程序UICollectionView中使用,具有自定义单元格但具有默认流程.目前,该视图连续显示3个单元格(所有单元格大小相同).单元格从左到右填充行,但我需要从右到左.
可能吗?我是否需要创建自定义流程布局?如果是这样,任何人都可以举个简单的例子?
任何帮助将不胜感激.
Raz*_*Raz 10
假设您只期望三个单元格,并使用此集合视图的标题视图,则需要执行以下步骤:
覆盖UICollectionViewFlowLayout
@interface GSRightToLeftCollectionViewFlowLayout : UICollectionViewFlowLayout
Run Code Online (Sandbox Code Playgroud)
(GS代表Groboot SmarTech :))
.m应该如下所示:
#import "GSRightToLeftCollectionViewFlowLayout.h"
typedef enum {
// enum for comfortibility.
CellXPositionLeft = 1,
CellXpositionRight = 2,
CellXpositionCenter = 3,
CellXPositionNone = 4
} CellXPosition;
@interface GSRightToLeftCollectionViewFlowLayout ()
@property (nonatomic) BOOL cellFlag;
@property (nonatomic) float cellLeftX;
@property (nonatomic) float cellMiddleX;
@property (nonatomic) float cellRightX;
@end
@implementation GSRightToLeftCollectionViewFlowLayout
// when ever the bounds change, call layoutAttributesForElementsInRect:
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
return YES;
}
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSMutableArray *allItems = [[super layoutAttributesForElementsInRect:rect] mutableCopy];
for (UICollectionViewLayoutAttributes *attribute in allItems) {
// when we get an item, calculate it's English writing position,
// so that we can convert it to the Hebrew - Arabic position.
if (!self.cellFlag) {
[self calculateLocationsForCellsWithAttribute:attribute];
self.cellFlag = YES;
}
// if it's a header, do not change it's place.
if (attribute.representedElementKind == UICollectionElementKindSectionHeader) {
continue;
}
// check where the item should be placed.
CellXPosition position = [self attributeForPosition:attribute];
switch (position) {
case CellXPositionLeft:
attribute.frame = CGRectMake(self.cellLeftX, attribute.frame.origin.y, attribute.frame.size.width, attribute.frame.size.height);
break;
case CellXpositionRight:
attribute.frame = CGRectMake(self.cellRightX, attribute.frame.origin.y, attribute.frame.size.width, attribute.frame.size.height);
break;
case CellXpositionCenter:
attribute.frame = CGRectMake(self.cellMiddleX, attribute.frame.origin.y, attribute.frame.size.width, attribute.frame.size.height);
break;
case CellXPositionNone:
NSLog(@"warning");
break;
}
}
return allItems;
}
- (CellXPosition)attributeForPosition:(UICollectionViewLayoutAttributes *)attribute
{
CellXPosition cellXposition = CellXPositionNone;
// we will return an opposite answer
if (attribute.indexPath.row % 3 == 0) {
// if it's in the left side, move it to the right
cellXposition = CellXpositionRight;
} else if (attribute.indexPath.row % 3 == 1) {
cellXposition = CellXpositionCenter;
} else if (attribute.indexPath.row % 3) {
// if it's in the right side, move it to the left
cellXposition = CellXPositionLeft;
}
return cellXposition;
}
- (void)calculateLocationsForCellsWithAttribute:(UICollectionViewLayoutAttributes *)attribute
{
float cellWidth = self.itemSize.width;
float minimumX = self.sectionInset.left;
float maximumX = self.sectionInset.right;
float displayWidth = self.collectionView.contentSize.width - minimumX - maximumX;
// on iOS6, displayWidth will be 0 (don't know why), so insert an if (displayWidth == 0) and set manually the size.
self.cellLeftX = minimumX;
float space = (displayWidth - cellWidth * 3) / 2;
self.cellMiddleX = self.cellRightX + cellWidth + space;
self.cellRightX = self.cellMiddleX + cellWidth + space;
}
@end
Run Code Online (Sandbox Code Playgroud)
在显示CollectionView的类中,您需要执行以下操作:
如果您使用的是故事板:1.将collectionView布局更改为自定义(在属性检查器中)2.将其类设置为GSRightToLeftCollectionViewFlowLayout.3.在ViewDidLoad中(或者每当执行初始化时)
- (void)viewDidLoad
{
[super viewDidLoad];
GSRightToLeftCollectionViewFlowLayout *layout = [[GSRightToLeftCollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(98, 138); // set the item size.
layout.minimumLineSpacing = 1; // other layout properties.
layout.minimumInteritemSpacing = 1; // other layout properties.
layout.headerReferenceSize = CGSizeMake(50, 18);
layout.sectionInset = UIEdgeInsetsMake(1.0f, 0.0f, 1.0f, 0.0f);
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
// in case you use headers / footers. this is also where you would register a Cell if you don't use storyboards.
[self.collectionView registerClass:[GSReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView"];
self.collectionView.collectionViewLayout = layout;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我有同样的问题,因为阿拉伯语翻译.
这是我的解决方案:创建UICollectionViewFlowLayout的子类并覆盖
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect:
Run Code Online (Sandbox Code Playgroud)
我使用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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10111 次 |
| 最近记录: |