UICollectionView的单元格消失

发生了什么

目前我有一个应用程序在UITableView中使用两个UICollectionViews 。 这样我创build一个像应用程序的脉冲新闻看起来。 我的问题是有时候第六和第十一行会完全消失,留下应该是单元格的空白处。 我真的不介意,如果所有的细胞都是这样的(这样我可以假设我没有正确地做事),但事情是,正在发生那些具体的事情。

我的理论

第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的错误,但我想不出别的。


编辑1.0

令人惊叹的是这种方法

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

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


编辑2.0

我已经改变了我创build单元格的方式,而不是使用旧的方式去队列:

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

还是一样的伤心的结果。

那么,什么工作?

1)子类UICollectionViewFlowLayout

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

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

 self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 

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

4) 重要部分

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

在这一刻,我应该理论一点,但老实说,我没有线索。

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

任何人提供的解决scheme都没有帮助我在我们的自定义布局,我们需要在我们的应用程序。 相反,我必须这样做:(是的, 它工作 !!!)

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

毕竟,UICollectionView只是查找要显示在屏幕矩形中的元素的属性。

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

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

当我估计高度位低的那一刻,所有的细胞都出现了。

对我来说,这个问题似乎与我使我的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合作,但我希望它可以帮助别人。

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

你可以看到这个演示: https : //github.com/lqcjdx/YLTagsChooser ,所有的单元格可以出现时,UICollectionView scolling。