UICollectionView单元格左上角绘制

时间:2015-04-20 16:01:18

标签: ios objective-c uicollectionview uicollectionviewcell

这是我第一次使用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]];}

请注意,幻灯片对象存在于模型中。

关于可能导致此问题的任何想法?提前谢谢!

1 个答案:

答案 0 :(得分:0)

导致单元格向左上方和/或消失的问题是由后台线程上的无限递归引起的。简单而简单,我没有正确安全地实现延迟加载。为了解决这个问题,我回到绘图板再次尝试。正确实现延迟加载算法就可以了。