Как я могу создать индикатор активности в середине программы программно?
Я работаю с приложением, которое анализирует канал онлайн. когда я нажимаю кнопку обновления, требуется некоторое время для повторного анализа файла и отображения его данных. Я хочу, чтобы индикатор активности находился в середине представления, когда я нажимаю кнопку обновления. и когда выполняется синтаксический анализ, этот индикатор должен скрываться.
Я использую этот код, но его не работает.
- (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)