这是我第一次使用UICollectionView。
我已经设置了所有内容并按照应有的布局(据我所知)。我对dequeue函数对UICollectionView的工作方式有点困难,但我想我已经过去了。当我不知道是否会调用initWithFrame或prepareForReuse时,设置我的自定义单元类很棘手。
我很确定问题出在prepareForReuse函数中,但其中是问题所在。
发生的情况是,单元格显然会在集合视图的左上角随机绘制,而某些单元格将不在它们属于网格的位置。 (见附图)
当弹跳,滚动和缩放(以便导致重用)时,问题就出现了。随机滑动将出现在左上方,其他幻灯片将随机从网格中消失。
(我需要更多代表来发布图片。呃。:|如果你可以帮助我,我会给你发电子邮件.bmantzey @ mac.com)
-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
Slide* thisSlide = [_presentation.slidesInEffect objectAtIndex:indexPath.row];
[BuilderSlide prepareWithSlide:thisSlide];
BuilderSlide* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PlainSlide" forIndexPath:indexPath];
return cell;}
我正在使用静态方法设置Slide对象,其中包含准备异步下载或从磁盘缓存中检索图像所需的数据。
这很简单:
+(void)prepareWithSlide:(Slide*)slide{
if(s_slide)
[s_slide release];
s_slide = [slide retain];}
我不确定这是否是一个很大的禁忌,但在我的自定义Cell类中,我在initWithFrame块中调用prepareForReuse,因为我需要设置代码相同:
-(id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if(self)
{
[self prepareForReuse];
}
return self;}
这是prepareForReuse函数:
-(void)prepareForReuse{
CGSize size = [SpringboardLayout currentSlideSize];
[self setFrame:CGRectMake(0, 0, size.width, size.height)];
self.size = size;
// First remove any previous view, so as not to stack them.
if(_builderSlideView)
{
if(_builderSlideView.slide.slideID == s_slide.slideID)
return;
[_builderSlideView release];
}
for(UIView* aView in self.contentView.subviews)
{
if([aView isKindOfClass:[BuilderSlideView class]])
{
[aView removeFromSuperview];
break;
}
}
// Then setup the new view.
_builderSlideView = [[BuilderSlideView alloc] initWithSlide:s_slide];
self.builderCellView = _builderSlideView;
[s_slide release];
s_slide = nil;
[self.contentView addSubview:_builderSlideView];
if([SlideCache isImageCached:_builderSlideView.slide.slideID forPresentation:_builderSlideView.slide.presentationID asThumbnail:YES])
{
[_builderSlideView loadImageFromCache];
}
else
{
[_builderSlideView loadView];
}}
最后,当下载幻灯片图像时,会发布通知(我打算将其更改为委托调用)。通知只是重新加载已收到更新的单元格。这是通知代码:
-(void)didLoadBuilderCellView:(NSNotification*)note{
BuilderCellView* cellView = [[note userInfo] objectForKey:@"cell"];
BuilderSlideView* slideView = (BuilderSlideView*)cellView;
NSIndexPath* indexPath = [self indexPathForSlide:slideView.slide];
if(indexPath)
[self.collectionView reloadItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];}
请注意,幻灯片对象存在于模型中。
关于可能导致此问题的任何想法?提前谢谢!
答案 0 :(得分:0)
导致单元格向左上方和/或消失的问题是由后台线程上的无限递归引起的。简单而简单,我没有正确安全地实现延迟加载。为了解决这个问题,我回到绘图板再次尝试。正确实现延迟加载算法就可以了。