【问题标题】:UIButton action with UIActivityIndicator带有 UIActivityIndi​​cator 的 UIButton 操作
【发布时间】:2013-08-21 11:28:51
【问题描述】:

我正在尝试处理这样的事情:

我有一个UIButton 操作,它正在调用UIImagePickerController 并展示它以进行拍摄。但是加载需要一段时间 - 特别是在第一次运行时。所以我决定设置一个UIActivityIndicator,以便在加载相机时保持旋转。

但我遇到了一个问题 - UIImagePicker 正在主线程中加载,因此指示器不会显示。我该如何解决这个问题?

这是我的方法:

- (IBAction)takePhoto:(UIButton *)sender
{
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.allowsEditing = YES;
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

    UIActivityIndicatorView *activityView=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    activityView.center=self.view.center;
    [self.view addSubview:activityView];
    [activityView startAnimating];

    [self presentViewController:imagePicker animated:NO completion:nil];
}

【问题讨论】:

  • 我不确定...我只是在猜测...我只想在加载相机时显示此指示器以使一切看起来干净整洁。
  • 打开相机需要更多时间吗?我不认为我加载缓慢,你需要添加活动指示器
  • 当我点击按钮时,它会保持高亮状态约 3 秒。然后出现选择器。
  • 你能详细说明一下吗,因为我在 sampleExample 中使用了你的代码片段,然后在我的情况下它工作正常,打开相机的虹膜需要时间
  • @frozen_lion 已经按照我想要的方式回答了我的问题

标签: ios multithreading uiimagepickercontroller uiactivityindicatorview


【解决方案1】:

我也遇到过同样的问题,UIImagePickerController 分配需要很长时间,所以为了避免主线程阻塞,你可以使用下一个代码:

- (IBAction)takePhoto:(UIButton *)sender
{
    UIActivityIndicatorView *activityView=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    activityView.center=self.view.center;
    [self.view addSubview:activityView];
    [activityView startAnimating];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.allowsEditing = YES;
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

        dispatch_async(dispatch_get_main_queue(), ^{
            [self presentViewController:imagePicker animated:NO completion:nil];
        });
    });
}

【讨论】:

  • 这一款正以我想要的方式为我工作。刚刚添加了这一行:[self presentViewController:imagePicker animated:NO completion:^{[activityView stopAnimating];}] 以阻止它旋转到死!
【解决方案2】:

试试这个:

- (IBAction)takePhoto:(UIButton *)sender
{
     UIActivityIndicatorView *activityView=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
     activityView.center=self.view.center;
     [self.view addSubview:activityView];
     [activityView startAnimating];

     int64_t delayInSeconds = 2.0;//How long do you want to delay?
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

         UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
         imagePicker.delegate = self;
         imagePicker.allowsEditing = YES;
         imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

         [self presentViewController:imagePicker animated:NO completion:nil];
     });         
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多