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。