【问题标题】:how do i scroll through 100 photos in UIScrollView in IPhone如何在 iPhone 的 UIScrollView 中滚动浏览 100 张照片
【发布时间】:2010-05-10 21:59:29
【问题描述】:

我正在尝试滚动浏览从用户在线相册下载的图像(例如在 facebook iphone 应用程序中),因为我无法将所有图像加载到内存中,我一次加载 3 个(上一个、当前和下一个)。然后从 uiscroller 子视图中删除 image(prev-1) & image (next +1)。 我的逻辑在模拟器中运行良好,但在设备中失败并出现以下错误: [CALayer retain]:消息发送到解除分配的实例 可能是什么问题呢 下面是我的代码示例

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView 
{
    pageControlIsChangingPage = NO;
    CGFloat pageWidth = _scrollView.frame.size.width;
    int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

    if (page>1 && page<=(pageControl.numberOfPages-3)) {
        [self removeThisView:(page-2)];
        [self removeThisView:(page+2)];
    }

    if (page>0) {
        NSLog(@"<< PREVIOUS");
        [self showPhoto:(page-1)];
    }

    [self showPhoto:page];
    if (page<(pageControl.numberOfPages-1)) {
        //NSLog(@"NEXT >>");
        [self showPhoto:page+1];
        NSLog(@"FINISHED LOADING NEXT >>");
    }
}

-(void) showPhoto:(NSInteger)index
{
    CGFloat cx = scrollView.frame.size.width*index;
    CGFloat cy = 40;

    CGRect rect=CGRectMake( 0, 0,320, 480);
    rect.origin.x =  cx;
    rect.origin.y = cy;
    AsyncImageView* asyncImage = [[AsyncImageView alloc] initWithFrame:rect];
    asyncImage.tag = 999;
    NSURL *url = [NSURL URLWithString:[pics objectAtIndex:index]];

    [asyncImage loadImageFromURL:url place:CGRectMake(150, 190, 30, 30) member:memberid isSlide:@"Yes" picId:[picsIds objectAtIndex:index]];

    [scrollView addSubview:asyncImage];
    [asyncImage release];
}

- (void) removeThisView:(NSInteger)index
{
    if (index<[[scrollView subviews] count] && [[scrollView subviews] objectAtIndex:index]!=nil) {
        if ([[[scrollView subviews] objectAtIndex:index] isKindOfClass:[AsyncImageView class]] || [[[scrollView subviews] objectAtIndex:index] isKindOfClass:[UIImageView class]]) {
            [[[scrollView subviews] objectAtIndex:index] removeFromSuperview];
        }
    }
}

据记录,它在模拟器中工作正常,但不是 iphone 设备本身。 任何想法将不胜感激。 干杯, 弗雷德。

【问题讨论】:

    标签: iphone objective-c memory


    【解决方案1】:

    我猜你的 AsyncImageView 类使用异步连接来加载图像(这是一件好事),这意味着当你将它添加为滚动视图的子视图时,它可能在图像完全加载之前被“removedFromSuperview” .检查你的类的实现,如果委托在被释放时被正确地归零,并且任何连接都被取消等等。

    请注意,类永远不应保留其委托,“分配”类型的属性非常适合这些情况。


    一些提示:

    1. 不要在滚动时分配/初始化和释放这么多实例,而是尝试在类中保留三个 ivars,并在滚动时更改实例的“框架”属性。如果用户快速滚动,您将避免大量分配和释放,这对 iPhone 来说是件好事。
    2. 避免在代码中直接访问 ivar;使用属性,除了简单的“正确性”之外,它们还有许多优点(KVO 就是其中之一)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多