2012-11-13 113 views
50

发生了什么事UICollectionView的细胞消失

目前,我有使用两个UICollectionViews一个UITableView中的应用程序。这样我创建了一个类似于应用程序的Pulse News外观。我的问题是,有时第6行和第11行完全消失,留下应该是单元格的空白空间。如果所有的单元格都是这样的(这样我就可以认为我没有正确地做事),但我不会介意,但事情是,正好发生在那些特定的单元格上。

我的理论

第6和第11行是那些当我开始滚动所以在默认情况下,我能看到5个细胞出现,当我做的第一水平滚动第六届上来(有时候是空白)。

我有什么

我目前做的唯一事情是这样的:

[self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER]; 

viewDidLoad。而在创作细胞:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath]; 

    NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]]; 

    [cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController]; 

    return cell; 
} 

所以我低估没有什么特别的事情在这里。我虽然在数据源(一个虚拟的JSON文件)上出现了问题,但有时它工作正常,单元格显示,所以我认为从该部分可以确定。

所以我的“问题”:有谁知道发生了什么事?我真的不想说这是来自iOS的一个bug,但我想不出别的。


编辑1.0

惊人的一部分,该方法

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

是不计算[0打算从indexPath [0,4]到[0,6], 5]。我第一次在iOS中看到这种情况。


编辑2.0

我转,我创建了细胞的方式,而不是离队我现在用的是老办法:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil]; 
MyCell *cell = (MyCell *)[nib objectAtIndex:0]; 

还是同样伤心的结果。

+0

我得到同样的问题,但消失的单元最终呈现在以前的单元格下面!很奇怪。我认为这是iOS中的一个错误。 –

+0

奇怪的事情正在发生。 = /但仍然是一个优秀的控制器.. – Peres

+0

我有使用集合视图创建的经典网格视图。我有3个细胞连续,有小间隙。同样的事情发生在这里,但似乎非常随机。不时有一个细胞被放置在连续的第四个地方,并且在预期的地方没有任何东西。 –

回答

33

那么,什么工作?

1)子类UICollectionViewFlowLayout

2)将我的UICollectionView的flowLayout设置为我的新子类。

3)在UICollectionViewFlowLayout子类的init方法,设置你想要的方向:

self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 

在我的情况下,它是水平的。

4)重要组成部分

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds 
{ 
    return YES; 
} 

在这个时刻,我应该理论化一点,但说实话我没有线索。

+3

看看这个bug:http://openradar.appspot.com/12433891难道是你遇到的? –

+0

我必须诚实Rob,在使用'UICollectionView'时发生奇怪的事情,不确定它是否相关。 – Peres

+1

您是否尝试过调整单元格宽度和高度?我在水平滚动收藏视图中遇到同样的渲染问题。当我的单元格宽度为70,高度为70时,我得到消失的单元格。如果我将单元格宽度保持为70,并将单元格高度更改为69,则它会正确渲染。我可以每次重现这种情况。 –

3

罗布的有关错误尖帮我。该错误指出,如果节插入和单元格的宽度和间距恰好与屏幕宽度相加,那么第一列有时会随机消失,并在某些地方重新出现某些单元格。我没有细分或改变单元格宽度,而是将故事板中的左侧和右侧的部分插图从6更改为4,并且我没有再次看到问题。

+1

我无法使用Rob的解决方案修复它。但我真的很高兴它为你工作。 – Peres

11

以上的答案并没有为我工作,但下载图像后,我更换了代码 [self.myCollectionView reloadData][self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; 刷新的CollectionView,它显示的所有单元格,你可以试试。

+3

哇,这实际上工作... –

+0

愚蠢的是,这也适用于我...以及'UICollectionView'怎么回事? – LucasTizma

+0

试过上面的其他解决方案,没有人工作(Swift 3),这个修复了这个bug。奇怪... – Antoine

4

任何人给出的解决方案中没有帮助我,我们需要在我们的应用程序我的自定义布局。 相反,我不得不这样做:(而且是啊,IT WORKS !!!)

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{ 
    CGSize size = [self collectionViewContentSize]; 
    rect.size.height = size.height*2; 
    NSArray *atrributes_Super = [super layoutAttributesForElementsInRect:rect]; 
    return atrributes_Super; 
} 

毕竟,UICollectionView只是寻找一个元素的属性显示在屏幕的矩形。

+0

类似的事情发生在这里。 我的layoutAttributesForElementsInRect实现没有返回所需单元格的属性,而该属性又被设置为.hidden = YES。 – jcardenete

1

在我的情况(垂直滚动,与细胞第一视图消失),将细胞由于不正确的估计大小消失。看起来,UICollectionView使用估计大小来计算要在第一个视图中加载的项目。我会将估计的尺寸设置得太高,导致第一个屏幕中要加载的项目数量计算错误。

我做出了预测的高度有点低的那一刻,所有的细胞正确显示。

0

对我来说,这个问题似乎与我让我的CollectionView适应开放式键盘,以防止内容重叠的方式有关。

在我的观察,以应对KeyboardWillShow我有这个:

var userInfo = obj.UserInfo[UIKeyboard.FrameEndUserInfoKey]; 
if (userInfo is NSValue value) 
{ 
    var rect = value.CGRectValue; 
    var windowOffset = this.Superview.ConvertPointToView(this.Frame.Location, UIApplication.SharedApplication.KeyWindow); 
    var newHeight = rect.Y - windowOffset.Y; 

    this._controller.CollectionView.Frame = new CGRect(0, 0, this._controller.CollectionView.Frame.Width, newHeight); 
} 

将其更改为在此之后:

var userInfo = obj.UserInfo[UIKeyboard.FrameBeginUserInfoKey]; 
if (userInfo is NSValue value) 
{ 
    var rect = value.CGRectValue; 
    UIEdgeInsets contentInsets = new UIEdgeInsets(0, 0, rect.Height, 0); 
    this._controller.CollectionView.ContentInset = contentInsets; 
    this._controller.CollectionView.ScrollIndicatorInsets = contentInsets; 
} 

细胞消失的问题完全走了。这是C#与Xamarin合作,但我希望它可以帮助别人。

0

我认为这不是一个UICollectionView的错误,也许你不能在- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect方法中返回正确的数据。

你可以看到这个演示:https://github.com/lqcjdx/YLTagsChooser,scolling的UICollectionView当所有的细胞可以出现。

0

我们最近遇到消失的单元,发现我们不小心插入了0x0大小的单元而不是跳过'隐藏'单元。由此产生的行为是非常混乱,并没有暗示这些看不见的细胞是问题。我们会看到正确大小的单元格和布局,但有些有效单元格在屏幕上滚动/关闭后会一直消失。我不知道为什么混合0大小的单元格会导致这种行为,但删除它们可以解决问题。这可能不会导致您的问题,但这可能有助于开发人员搜索类似的症状。