0

每次用户点击 mkannotationPinView 顶部时,我都希望隐藏并启动活动指示器。

这是我的代码:

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    if (!self.activityIndicator) {
        NSLog(@"error");
    }
    self.activityIndicator.hidden = NO;
    [self.mapView addSubview:self.activityIndicator];
    [self.activityIndicator startAnimating];
    if ([view.leftCalloutAccessoryView isKindOfClass:[UIImageView class]]) {
        UIImageView *imageView = (UIImageView *)(view.leftCalloutAccessoryView);
        if ([view.annotation respondsToSelector:@selector(thumbnail)]) {
            imageView.image = [view.annotation performSelector:@selector(thumbnail)];
        }
    }
    [self.activityIndicator stopAnimating];
}

我也尝试过切换[self.mapView addSubview:self.activityIndicator];[self.view addSubview:self.activityIndicator];但效果是一样的,没有出现在视图上。有什么问题???谢谢

4

3 回答 3

2

再次在主线程上启动动画后排队代码。您可以使用

  • dispath_asyn
  • PerformSelectorOnMainThread
  • PerformSelectorInBackground

这三个应该都可以正常工作。

    -(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
    {
        if (!self.activityIndicator) {
            NSLog(@"error");
        }
        self.activityIndicator.hidden = NO;
        [self.mapView addSubview:self.activityIndicator];
        [self.activityIndicator startAnimating];

        dispatch_async(dispatch_get_main_queue(), ^(void) {
           if ([view.leftCalloutAccessoryView isKindOfClass:[UIImageView class]]) {
                UIImageView *imageView = (UIImageView *)(view.leftCalloutAccessoryView);
                if ([view.annotation respondsToSelector:@selector(thumbnail)]) {
                    imageView.image = [view.annotation performSelector:@selector(thumbnail)];
                }
                [self.activityIndicator stopAnimating];
          }
        });
    }

说明:如果您在不排队主线程中的操作的情况下进行 UI 操作,效果将不可见,因为 UI 不会显示任何活动,除非您完成运行线程并移至主线程中的下一个操作。addSubview removeSubview 也同样有效。

于 2013-10-23T19:20:31.700 回答
1

我不知道这是否可以解决您的问题,但我认为您没有正确实施活动指示器。活动指示器用于在后台下载/更新/任何内容时显示。所以..你的代码必须是这样的:

-(void)methodThatShowsTheActivityIndicator{
    self.activityIndicator.hidden = NO;
    [self.activityIndicator startAnimating];
    [self performSelectorInBackground:@selector(backgroundProcess) withObject:self];
}

-(void)backgroundProcess{
    //some process
    [self performSelectorOnMainThread:@selector(finishLoad) withObject:self waitUntilDone:false];
}


-(void)finishLoad{
    self.activityIndicator.hidden = YES;
    [self.activityIndicator stopAnimating];
}

希望它有所帮助!

于 2013-10-23T19:09:08.193 回答
0
  1. 确保为您分配了活动指示器
  2. 如果是这样 - 您看不到它,因为活动指示器的 hidesWhenStopped 属性默认设置为 YES。您的代码将执行得非常快,您甚至不会看到活动指示器
于 2013-10-23T18:59:39.080 回答