UIActivityIndi​​catorView未在合适的时间显示

时间:2012-11-09 10:58:50

标签: ios uiactivityindicatorview uiviewanimation

我正在创建一个允许用户在我的IOS应用程序中输入数据的表单。此表单允许用户输入大量重复数据。所以,有时候,这个过程需要时间,我想在这个过程中显示一个UIActivityIndi​​catorView。

不幸的是,旋转器在过程结束时只出现一秒或更短时间,而不是按预期开始。

有一些代码:

- (void) manageSpinner{
    spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    [spinner setCenter:CGPointMake(self.view.bounds.size.width/2.0, self.view.bounds.size.height/2.0)]; // I do this becau I'm in landscape mode
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.tableView.bounds];
    UIImage *image = [UIImage imageNamed:@"dark_gradiant.jpg"];
    [imageView setImage:image];
    [imageView addSubview:spinner];
    [self.tableView addSubview:imageView];
    [spinner startAnimating];
}


//On click save by the user
- (IBAction)save:(id)sender{

    //Collect information from the form

    myObject.name = nameTF.text;

    [...]

    if(informations OK[...]){        
        //Manage spinner
        [self manageSpinner];

        //Add : this is the long process
        for (int i=0; i<nbRepeatChooseByUser; i++) {
            [myObject register];
        }

        //Call the delegate that will dismiss the form
        [self.delegate theSaveButtonOnTheAddMyObjectTVCWasTapped:self];
    }
}

在添加方法之前调用微调器,但它似乎是在该过程之后设置的。

谢谢,

亚历山大

4 个答案:

答案 0 :(得分:2)

活动指示器与您的长进程在同一个线程上运行,因此动画不会在您想要的时候立即启动。尝试在后台线程中运行您的长进程。

if(informations OK[...]){        
    //Manage spinner
    [self manageSpinner];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        // Do your background process here
        //Add : this is the long process
        for (int i=0; i<nbRepeatChooseByUser; i++) {
            [myObject register];
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            //This section will be called after your long process has been completed.

            //Call the delegate that will dismiss the form
            [self.delegate theSaveButtonOnTheAddMyObjectTVCWasTapped:self];
        });

    });

}

答案 1 :(得分:1)

这是因为TableView正在耗尽mainThread,同时你希望微调器执行。在这种情况下,编译器会对动作进行排队。因此,微调器动画突然发生..

要同步动作,请在背景线程中使微调器具有动画效果..

执行以下选项以启动和停止微调器

开始:[spinner performSelectorInBackground:@selector(startAnimating) withObject:self];  停止:[spinner performSelectorInBackground:@selector(stopAnimating) withObject:self];

答案 2 :(得分:0)

活动指示符被主线程中执行的操作阻止。 因此,将操作更改为背景线程,如:

dispatch_queue_t backgroundQueue;
backgroundQueue = dispatch_queue_create("registerqueue", NULL); 
dispatch_async(backgroundQueue, ^(void) {
        for (int i=0; i<nbRepeatChooseByUser; i++)
        {
            [myObject register];
        }
    });

不要忘记导入

#import <dispatch/dispatch.h>

答案 3 :(得分:0)

我找到了一个很好的MIT库来管理UISpinner:https://github.com/matej/MBProgressHUD