gpt4 book ai didi

ios - 在自定义 UICollectionView 中出列时返回错误的单元格

转载 作者:可可西里 更新时间:2023-11-01 06:16:13 27 4
gpt4 key购买 nike

我正在构建一个具有自定义布局的 UICollectionView。

布局为 3x4,水平滚动。我的单元格布局和页面滚动工作正常。

我的预期结果是这样的:

enter image description here

(可在 http://www.tinyuploads.com/images/0EVQnT.png 获得)

但是,滚动时似乎错误的单元格正在出列,而我的实际结果是这样的:

enter image description here

(可在 http://www.tinyuploads.com/images/8lvJId.png 获得)

此外,当我滚动回到第一页时,“A”不再位于第一个位置。

我的数据源和委托(delegate)方法如下所示:

#pragma mark - UIViewController Life Cycle

- (void)viewDidLoad
{
[super viewDidLoad];

self.collectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];
self.alphabet = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"X", @"Y", @"Z", nil];
self.colors = [NSMutableArray arrayWithObjects:[UIColor colorWithRed:(135/255.0) green:(175/255.0) blue:(88/255.0) alpha:1], [UIColor colorWithRed:(65/255.0) green:(124/255.0) blue:(185/255.0) alpha:1], [UIColor colorWithRed:(201/255.0) green:(189/255.0) blue:(64/255.0) alpha:1], nil];

[self.collectionView reloadData];
}


#pragma mark - UICollectionView datasource

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{

return self.alphabet.count;

}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

NSString *title = [self.alphabet objectAtIndex:indexPath.row];
UIColor *backgroundColor = [self.colors objectAtIndex:indexPath.row % 3];

CategoryCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CategoryCellIdentifier forIndexPath:indexPath];

cell.title.text = title;
cell.backgroundColor = backgroundColor;
[cell setNeedsLayout];

return cell;

}

#pragma mark - UICollectionViewDelegate

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

NSLog(@"You touched: %d", indexPath.row);
}

我不确定我应该如何考虑部分。正如您在这里看到的,我只有一个部分包含我的所有项目(字母表的内容)。

非常感谢任何帮助。

最佳答案

W据我所知,子类可能未正确实现。这是一个使用内置水平流布局的示例,您可以使用它来修改代码。

注意:此示例假设您已在 Storyboard 中设置了正确的大小,并且您将拥有 3 列乘 4 行。

@interface ViewController ()
@property (nonatomic, strong) NSMutableArray* alphabet;
@property (nonatomic, strong) NSMutableArray* colors;

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

self.collectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];
self.alphabet = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil];
self.colors = [NSMutableArray arrayWithObjects:[UIColor colorWithRed:(135/255.0) green:(175/255.0) blue:(88/255.0) alpha:1], [UIColor colorWithRed:(65/255.0) green:(124/255.0) blue:(185/255.0) alpha:1], [UIColor colorWithRed:(201/255.0) green:(189/255.0) blue:(64/255.0) alpha:1], nil];

[self.collectionView reloadData];
}
#pragma mark - UICollectionView datasource

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
// Full pages
NSInteger count = self.alphabet.count /12 + (self.alphabet.count % 12 > 0 ? 1 : 0);
count *= 12;
return count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{


NSInteger row = indexPath.row % 4;
NSInteger col = indexPath.row / 4;
NSInteger page = col /3 * 12;
col = col % 3;
NSInteger ii = row*3+col + page;

NSString *title = ii >= self.alphabet.count ? nil : [self.alphabet objectAtIndex:ii];
UIColor *backgroundColor = [self.colors objectAtIndex:col];

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
UILabel* label = (UILabel*)[cell viewWithTag:1]; // label added in storyboard
label.text = title;
cell.backgroundColor = backgroundColor;
[cell setNeedsLayout];
cell.hidden = title == nil;
return cell;

}

#pragma mark - UICollectionViewDelegate

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

NSLog(@"You touched: %d", indexPath.row);
}
@end

关于ios - 在自定义 UICollectionView 中出列时返回错误的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14183687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com