单个 UIImageView 显示两个单独的图像

Posted

技术标签:

【中文标题】单个 UIImageView 显示两个单独的图像【英文标题】:Single UIImageView is displaying two separate images 【发布时间】:2015-07-20 14:41:22 【问题描述】:

我的应用程序中有一个UITableView,它为每个单元格从互联网上提取图像。在拉取该图像时,我在那里有一个占位符图像(在 InterfaceBuilder 中设置)。但是,当我将UIImageView 设置为来自网络的新图像时,它只是覆盖了旧图像而不是替换它。这很好,除非您实际上可以看到旧图像,因为这两个图像都是aspect-fit 并且不一定占据整个imageView

是线程问题吗?有没有一种方法可以让我设置占位符图像,使其立即出现,甚至在cellForRowAtIndexPath 之前?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    // Get a new or recycled cell
    RosterListingCellTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RosterCell" forIndexPath:indexPath];

    LineListing *thisRosterListing = [self.rosters objectAtIndex:indexPath.row];
    cell.playerNumberLabel.text = [NSString stringWithFormat:@"#%@",thisRosterListing.number];
    cell.playerNameLabel.text = thisRosterListing.name;


    cell.imageView.backgroundColor = [UIColor clearColor];

    cell.imageView.contentMode = UIViewContentModeScaleAspectFill;
    cell.imageView.clipsToBounds = YES;

    UIImage *playerImage = [self.imageCache objectForKey:thisRosterListing.playerImageURL];
    cell.imageView.image = playerImage;
    if (playerImage == nil) 

        NSURLSessionConfiguration *sessionConfig =
        [NSURLSessionConfiguration defaultSessionConfiguration];

        NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
        thisRosterListing.playerImageURL = [thisRosterListing.playerImageURL stringByReplacingOccurrencesOfString:@"small" withString:@"medium"];
        NSURLSessionDataTask *imageData = [session dataTaskWithURL:[NSURL URLWithString: thisRosterListing.playerImageURL]
                                                completionHandler:^(NSData *data,
                                                                    NSURLResponse *response,
                                                                    NSError *error) 
                                                    // handle NSData
                                                    UIImage *image = [UIImage imageWithData:data];
                                                    thisRosterListing.image = image;
                                                    [self.imageCache setObject:image forKey:thisRosterListing.playerImageURL];


                                                    dispatch_async(dispatch_get_main_queue(), ^
                                                        cell.imageView.image = image;
                                                        [self.tableView reloadData];
                                                    );
                                                ];
        [imageData resume];
    


    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
    imageView.image = [UIImage imageNamed:@"indicator"];
    cell.accessoryView = imageView;
    cell.backgroundColor = [UIColor clearColor];

    // set selection color
    UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
    myBackView.backgroundColor = [UIColor clearColor];
    cell.selectedBackgroundView = myBackView;

    return cell;

【问题讨论】:

能否请您发布更新图像的代码部分? UIImageView 不能同时显示两个图像,所以我猜你是在视图层次结构中添加多个图像视图。 您确定始终将图像设置在同一个图像视图上,而不是每次重复使用单元格时都添加额外的图像视图吗? 好的,我添加了我的cellForRowAtIndexPath method 您可以尝试使用自动布局解决此问题。事实上,这可能是一个相关问题。 你指的是什么自动布局问题? 【参考方案1】:

我认为您在两个不同的 UIImageViews 上设置图像。如果单击“调试视图层次结构”

xcode 运行时底部工具栏上的按钮你看到了什么。是两个不同的图像视图上的图像。我认为一个 UIImageView 不可能共享两个 UIImages

【讨论】:

你是 100% 正确的。有两个图像视图。我只是完全不知道第二个是如何添加的。它只能在我的 cellForRowAtIndexPath 中,不是吗?而且我不会在该代码中添加第二个,或者据我所知的任何地方。 好吧,您正在设置 UITableViewCell 的 accessoryView 属性,而不是您自己的自定义 UIImageView 您是否将UIImageView 属性添加到您的自定义单元格中。如果是这样,那么设置它而不是 UITableViewCellaccessoryView 属性 啊。我明白发生了什么。所以我继承了 UITableView 单元并添加了一个 imageView,我称之为“playerImageView”。在 IB 中,我将其设置为占位符图像。但是,在代码中,我将此 ImageView 称为 cell.imageView 而不是 cell.playerImageView。我的子类可能继承了一个名为 imageView 的属性。 您在此处将图像设置为 nil:`cell.imageView.image = playerImage;` 使用缓存返回的图像。在您知道图像不为零之前不要使用图像设置 imageView 否则它将删除当前设置在那里的图像。

以上是关于单个 UIImageView 显示两个单独的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个PHP代码在单独的字段中存储单独的图像

UIImageView 背景颜色但不显示图像

UIImageView 显示图像时如何防止 UIToolbar 调整大小?

UIImageView在设备上的启动屏幕中丢失图像

UITableViewCell 内的 UIImageView 没有得到更新

具有多个掩码的 U-Net 图像分割