UICollectionView - 图像随机设置

时间:2014-04-11 13:26:07

标签: ios uicollectionview uicollectionviewcell

我在我的应用程序中使用collectionView。我在didSelect委托中为单元backgroundView设置图像。但是当我选择一个单元格indexPath时,图像将被设置为3个单元格的indexPath。当我滚动collectionView时,图像会随机变化?请帮我。提前谢谢。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [collection registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:uio];
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:       (NSInteger)section
{
     return 50;
}

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

    UICollectionViewCell *cell = [collection dequeueReusableCellWithReuseIdentifier:uio
 forIndexPath:indexPath];
    cell.backgroundColor = [UIColor whiteColor];
   return cell;
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
 {
    NSLog(@"index %@",indexPath);
    UICollectionViewCell *cell = [collection cellForItemAtIndexPath:indexPath];

    cell.backgroundView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"download.jpg"]];

 }

5 个答案:

答案 0 :(得分:2)

那是因为你重复使用你的细胞。一个选项是使用一个字典变量来表示你的单元格已被选中,如果还没有,则重置图像。

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"index %@",indexPath);
    UICollectionViewCell *cell = [collection cellForItemAtIndexPath:indexPath];

    cell.backgroundView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"download.jpg"]];

    [selectedDictionary setObject:[NSNumber numberWithBool:YES] forKey:[NSNumber numberWithInteger:indexPath.row]];
}

然后在您的cellForItemAtIndexPath方法中,您将检查该值

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

    UICollectionViewCell *cell = [collection dequeueReusableCellWithReuseIdentifier:uio
 forIndexPath:indexPath];
    BOOL selected = [[selectedDictionary objectForKey:[NSNumber numberWithInteger:indexPath.row]] boolValue];

    if(selected){
        cell.backgroundView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"download.jpg"]];
    }else{
        cell.backgroundView = nil;
    }

    cell.backgroundColor = [UIColor whiteColor];
   return cell;
}

当然如果你使用某种对象作为模型,那么在这里选择一个变量是合适的,你不再需要nsdictionary了。

答案 1 :(得分:2)

问题是dequeueReusableCellWithReuseIdentifier

滚动UICollectionview时会重复使用单元格,这是有问题的 在Collectionview内添加scrollview

试试这个内部:

Scroll_View是您的滚动视图

集合是您的Collectionview

-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    self.Scroll_View.contentSize = CGSizeMake(self.view.frame.size.width, collectionView.contentSize.height);
    CGRect fram_For_Collection_View = self.collection_view.frame;
    fram_For_Collection_View.size.height = collectionView.contentSize.height;
    self.collection.view.frame = fram_For_Collection_View;
}

答案 2 :(得分:0)

您的-collectionView:didSelectItemAtPath:正在向该单元格添加新的图片视图。重复使用单元格时,没有任何东西可以删除该图像视图。所以,当你说:

UICollectionViewCell *cell = [collection dequeueReusableCellWithReuseIdentifier:uio

forIndexPath:indexPath];

在您的-collectionView:cellForItemAtIndexPath:中,您可能会找回已有一个或多个图片视图的单元格。

我的建议是将图像视图添加到单元格原型中的单元格中,可能在故事板或单元格的初始化程序中。让-collectionView:cellForItemAtIndexPath:将该图像视图的图像设置为给定路径的正确图像。

答案 3 :(得分:0)

发生的事情是UICollectionView重用了单元格。所以在didSelectItemAtIndexPath中:你设置了单元格背景,但是UICollectionView会根据需要重用相同的单元格(并且你没有重置cellForItemAtIndexPath中的cell.backgroundView :)。

解决此问题的方法是维护所选单元格的NSIndexSet。在didSelectItemAtIndexPath中:您可以添加所选项的索引,然后通过调用reloadItemsAtIndexPaths强制重新加载该项。然后,在你的cellForItemAtIndexPath中:检查索引集以查看是否包含所选索引,如果是,则设置单元格的backgroundView。

答案 4 :(得分:0)

前几天我有同样的问题&我在这里发了一个问题。这是我得到的答案&它对我有用。

Collection View Cell multiple item select Error

如果您使用的是自定义单元格,则可以将此代码添加到该单元格的init方法中。它也会起作用。

        CGFloat borderWidth = 6.0f;
        UIView *bgView = [[UIView alloc] initWithFrame:frame];
        bgView.layer.borderColor = [UIColor redColor].CGColor;
        bgView.layer.borderWidth = borderWidth;
        self.selectedBackgroundView = bgView;