Как я могу создать индикатор активности в середине программы программно?

Я работаю с приложением, которое анализирует канал онлайн. когда я нажимаю кнопку обновления, требуется некоторое время для повторного анализа файла и отображения его данных. Я хочу, чтобы индикатор активности находился в середине представления, когда я нажимаю кнопку обновления. и когда выполняется синтаксический анализ, этот индикатор должен скрываться. Я использую этот код, но его не работает.

- (IBAction)refreshFeed:(id)sender
{
   UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
   [self.view addSubview:spinner];

   [spinner startAnimating];

   // parsing code code

   [spinner release];
}

Ответы

Ответ 1

Для того, чтобы появиться, необходимо, чтобы идентификатор UIActivityIndicator был помещен в отдельный поток из длинного процесса (синтаксический анализ).

Если вы хотите сохранить все в одном потоке, вам нужно указать время индикатора. fooobar.com/questions/395849/... указывает на задержку в коде.

EDIT: Два года спустя я думаю, что в любое время, когда вы используете задержку, чтобы что-то случилось, вы, вероятно, ошибаетесь. Вот как я сейчас буду выполнять эту задачу:

- (IBAction)refreshFeed:(id)sender {
    //main thread
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [self.view addSubview:spinner];

    //switch to background thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

        //back to the main thread for the UI call
        dispatch_async(dispatch_get_main_queue(), ^{
            [spinner startAnimating];
        });
        // more on the background thread

        // parsing code code

        //back to the main thread for the UI call
        dispatch_async(dispatch_get_main_queue(), ^{
            [spinner stopAnimating];
        });
    });
}

Ответ 2

Я думаю, что не могу это объяснить well.ok позволяет попробовать еще раз. его навигация основанное приложение. У меня есть tableView. каждый ячейка создает detailView. на RootView который представляет собой кнопка обновления. когда я нажимаю, он снова анализирует канал. а также это занимает некоторое время. за это время программа не отвечает. и синтаксический анализ завершите работу снова. теперь мне нужно индикатор активности за это время. я Не знаю, как добавить xib. bcz когда я открыть main.xib и запустить работу индикатор в RootViewController. Это выходит за пределы всего tableView. Теперь может быть, я хорошо объяснил. если не позволю мне знаю, что я попробую еще раз.

от того, что вы говорите выше программы, не отвечает во время разбора, что является проблемой. Если графический интерфейс зависает во время анализа данных, вы должны перенести эту операцию на вторичный поток. Таким образом, ваш графический интерфейс останется отзывчивым, и вы сможете увидеть индикатор активности.

в главном потоке вы должны иметь что-то похожее, чтобы показать индикатор активности:

UIActivityIndicatorView  *av = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray] autorelease];
av.frame = CGRectMake(round((yourView.frame.size.width - 25) / 2), round((yourView.frame.size.height - 25) / 2), 25, 25);
av.tag  = 1;
[yourView addSubview:av];
[av startAnimating];

после завершения вторичного потока, это поток, в котором вы анализируете данные, вы должны вызвать в главном потоке что-то вроде этого, чтобы удалить индикатор активности:

UIActivityIndicatorView *tmpimg = (UIActivityIndicatorView *)[yourView viewWithTag:1];
[tmpimg removeFromSuperview];

Ответ 3

Измените центр индикатора активности как

activityIndicator.center = self.view.center;

Ответ 4

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityIndicator.alpha = 1.0;
[collectionVwSearch addSubview:activityIndicator];
activityIndicator.center = CGPointMake([[UIScreen mainScreen]bounds].size.width/2, [[UIScreen mainScreen]bounds].size.height/2);
[activityIndicator startAnimating];//to start animating

Для Swift

let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
activityIndicator.alpha = 1.0
collectionVwSearch.addSubview(activityIndicator)
activityIndicator.center = CGPointMake(UIScreen.mainScreen().bounds.size.width / 2, UIScreen.mainScreen().bounds.size.height / 2)
activityIndicator.startAnimating()

Чтобы остановить активностьIndicator wirte [activityIndicator stopAnimating] в соответствующем месте

Ответ 5

self.activity.center = CGPointMake(self.view.bounds.size.width / 2.0f, self.view.bounds.size.height / 2.0f);
self.activity.autoresizingMask = (UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin);

Ответ 6

Добавьте этот код перед началом своей задачи:

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[self.view addSubview:spinner];
[spinner setFrame:CGRectMake((self.view.frame.size.width/2)-(spinner.frame.size.width/2), (self.view.frame.size.height/2)-(spinner.frame.size.height/2), spinner.frame.size.width, spinner.frame.size.height)];
[spinner startAnimating];    

После завершения задачи добавьте:

[spinner stopAnimating];

Ответ 7

В Swift это работало для моего приложения

let activity_view = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
activity_view.frame =  CGRectMake(0.0, 0.0, 40.0,40.0)
activity_view.center = self.view.center
self.view.addSubview(activity_view)
activity_view.bringSubviewToFront(self.view)
activity_view.startAnimating()

Ответ 8

/ create activity indicator 
activityIndicator = [[UIActivityIndicatorView alloc] 
    initWithFrame:CGRectMake(0.0f, 0.0f, 20.0f, 20.0f)];
[activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite];

...
 [self.view addSubview:activityIndicator];
// release it
[activityIndicator release];

Лучший подход - добавить указатель на xib и скрыть/показать на основе вашего требования

Ответ 9

spinner.center = self.view.center;

Чтобы показать spinner from rootController, попробуйте:

[self.navigationController.visibleViewController.view addSubview:spinner];

или

[self.navigationController.view addSubview:spinner];

Ответ 10

попробуйте это

activityIndicator.center = CGPointMake(160,240);

Ответ 11

Проблема с некоторыми другими ответами заключается в том, что каждый новый индикатор активности добавляется каждый раз, так что подпункты начинают накапливаться. Вот полный пример, который использует только один UIActivityIndicator.

введите описание изображения здесь

Это весь код для проекта выше:

import UIKit
class ViewController: UIViewController {

    // only using a single spinner instance
    let spinner = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge)

    override func viewDidLoad() {
        super.viewDidLoad()

        // setup spinner
        spinner.backgroundColor = UIColor(white: 0, alpha: 0.2) // make bg darker for greater contrast
        self.view.addSubview(spinner)
    }

    @IBAction func startSpinnerButtonTapped(sender: UIButton) {

        // start spinner
        spinner.frame = self.view.frame // center it
        spinner.startAnimating()

        let qualityOfServiceClass = QOS_CLASS_BACKGROUND
        let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
        dispatch_async(backgroundQueue, {       

            // do something that takes a long time
            sleep(2)

            // stop spinner when background task finishes
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.spinner.stopAnimating()
            })
        })
    }
}

Ответ 12

Вы можете написать Swift 4

let spinner = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)

override func viewDidLoad() {
    super.viewDidLoad()

    spinner.backgroundColor = UIColor(white: 0, alpha: 0.2) // make bg darker for greater contrast
    self.view.addSubview(spinner)
}

@IBAction func foodActionBtn(_ sender: Any) {

    // start spinner
    spinner.frame = self.view.frame // center it
    spinner.startAnimating()

    let qualityOfServiceClass = QOS_CLASS_BACKGROUND
    let backgroundQueue = DispatchQueue.global(qos: .background)
    backgroundQueue.async(execute: {
        sleep(2)
        self.spinner.stopAnimating()
    })
}

Ответ 13

Мистер Посчэн, мой код работает. Но если вы хотите показать большое появление индикатора активности, вы можете использовать его....

var activityIndicator = UIActivityIndicatorView()
    activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
    activityIndicator.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
    let transform: CGAffineTransform = CGAffineTransform(scaleX: 1.5, y: 1.5)
    activityIndicator.transform = transform
    activityIndicator.center = self.view.center
    activityIndicator.startAnimating()
    self.view.addSubview(activityIndicator)