it-swarm.com.ru

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

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

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

   [spinner startAnimating];

   // parsing code code

   [spinner release];
}
13
Piscean

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

Если вы хотите, чтобы все было в одном потоке, то вам нужно дать время индикатору появиться. Этот вопрос Stackoverflow адресует размещение задержки в коде.

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

- (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];
        });
    });
}
17
Walter

Я думаю, что я не в состоянии объяснить это well.ok попробуем еще раз. это нав на основе приложения. у меня есть tableView. каждый ячейка создает detailView. на RootView который является табличным представлением есть кнопка обновления когда я нажму это Кнопка это снова анализирует канал. а также это займет некоторое время. на это время Программа не отвечает. и разбор есть завершить это работает снова. теперь мне нужно индикатор активности за это время. я не знаю, как добавить в XIB. бч когда я открываю 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];
12
Sorin Antohi

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

activityIndicator.center = self.view.center;
7
visakh7
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

Для Свифта

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()

Для прекращения активности Индикатор wirte [activityIndicator stopAnimating] на соответствующем месте  

6
Hardik Thakkar
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);
2
Vaibhav Saran

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

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];
1
iphondroid

В 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()
1
Juan Carlos Moreno

Вы можете написать 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()
    })
}
0
Sameer Saif

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

 enter image description here

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

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()
            })
        })
    }
}
0
Suragch
/ 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 и скрыть/показать его в зависимости от ваших требований

0
Swastik
spinner.center = self.view.center;

Чтобы показать спиннер из rootController, попробуйте:

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

или же

[self.navigationController.view addSubview:spinner];
0
xxcv

попробуй вот так

activityIndicator.center = CGPointMake(160,240);
0
visakh7