【问题标题】:Hide image while loading iOS加载 iOS 时隐藏图像
【发布时间】:2015-02-12 16:22:26
【问题描述】:

我正在使用 UIPicker 选择图像,当用户选择时,下载将开始。我正在从我的服务器下载 78 张图像来创建动画。如何在下载图像以隐藏当前图像(imageview)以及下载完成时显示图像(imageview)时制作它。我试过了,但它不起作用。

- (void)viewDidLoad

{
 [super viewDidLoad]
 // Load starting image, otherwise screen is blank
  self.radar_1 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 65, self.view.frame.size.width, self.view.frame.size.width-70)];

    radar_1.image = [UIImage animatedImageWithAnimatedGIFURL:[NSURL URLWithString:@"<|SERVER LINK|>"]];

    [self.view addSubview:radar_1];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

{

  if (row == 2) {
        self.radar_1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 65, self.view.frame.size.width, self.view.frame.size.width-70)];

        self.radar_1.hidden = YES;

        radar_1.animationImages = [NSArray arrayWithObjects:

                                   [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"<|SERVER LINK|> "]]],

                                   [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"<|SERVER LINK|> "]]],

                                   [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"<|SERVER LINK|>"]]],

                                   [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"<|SERVER LINK|>"]]],
{...} // Doing the same 77 times...

        radar_1.hidden = NO;

        radar_1.animationDuration = 20.0f;

        radar_1.animationRepeatCount = 0;

        [radar_1 startAnimating];

        [self.view addSubview: radar_1];
}

【问题讨论】:

  • 你好像缺少了[super viewDidLoad]?
  • 不,我只是忘了提出问题。

标签: ios uiimageview uiimage


【解决方案1】:

从用户体验的角度来看,从 NSURL 同步下载 70 张图片可能不是最好的主意。您是否有理由无法将所有图像放在 Sprite Sheet 中并下载单个图像,然后在客户端对其进行处理以显示动画?

如果您确实需要抓取 70 张图片,最好异步执行此操作,以便 UI 保持响应式。下面是一个可以使用的简单异步图像加载示例:

    - (void)downloadImageWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, UIImage *image))completionBlock
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                               if ( !error )
                               {
                                    UIImage *image = [[UIImage alloc] initWithData:data];
                                    completionBlock(YES,image);
                                } else{
                                    completionBlock(NO,nil);
                                }
                           }];
}

您可以保存一个计数器变量并通过调用上述方法的图像请求进行迭代。当每个都完成后,您可以勾选另一个成功的图像请求。当你拥有它们时,你就可以构建你正在制作的动画。

在发生这种情况时,您可以将 ActivityIndi​​cator 添加到您的视图中,让用户知道他们在等待时正在发生事情。

希望对一些人有所帮助。

【讨论】:

  • tnx,但是如何在下载时隐藏图像(imageview)?我计划减少 78 到 48 张图片。
  • 如果你只是想隐藏imageView,那么你可以这样做:self.radar_1.hidden = YES;
  • 我试过了(代码有问题),但它不起作用。
  • 对。因此,看起来您按以下顺序调用事物:1)选择图像 2)隐藏视图 3)获取大量网络内容 4)显示视图。这些都发生在 same_thread 上,因此您只会看到最终结果,即最后显示图像的视图。相反,您应该隐藏视图,转到另一个线程并请求图像,然后在图像加载后显示视图。
猜你喜欢
  • 1970-01-01
  • 2011-04-18
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2013-06-19
  • 2019-07-03
相关资源
最近更新 更多