オンラインでフィードを解析するアプリを使用しています。更新ボタンをクリックすると、ファイルを再解析してデータを表示するのに時間がかかります。 [更新]ボタンをクリックすると、ビューの中央にアクティビティインジケーターが表示されます。解析が完了すると、そのインジケーターは非表示になります。このコードを使用していますが、機能しません。
- (IBAction)refreshFeed:(id)sender
{
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[self.view addSubview:spinner];
[spinner startAnimating];
// parsing code code
[spinner release];
}
UIActivityIndicatorを表示するには、通常、長いプロセス(フィードの解析)とは別のスレッドに配置する必要があります。
すべてを同じスレッドに保持する場合は、インジケーターが表示されるまでの時間を指定する必要があります。 このStackoverflowの質問 コードに遅延を設定することを扱います。
編集:2年後、何かを起こすために遅延を使用しているときはいつでも、おそらくそれを間違っていると思います。これが私が今この仕事をする方法です:
- (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];
});
});
}
うまく説明できないと思います。もう一度やってみましょう。そのナビベースのアプリ。 tableViewがあります。すべてのセルがdetailViewを作成します。テーブルビューであるRootViewには、更新ボタンがあります。そのボタンをクリックすると、フィードが再度解析されます。少し時間がかかります。その間、プログラムは応答しません。解析が完了すると再び機能します。今私はその時の活動指標が必要です。 xibに追加する方法がわかりません。 main.xibを開いてRootViewControllerにアクティビティインジケーターを配置したときのbcz。 tableView全体の前に来ます。今私はよく説明されるかもしれません。そうでない場合は、もう一度やり直します。
あなたが上で言っていることから、プログラムは問題である解析中に反応しません。データの解析中にGUIがフリーズした場合は、その操作をセカンダリスレッドに移動する必要があります。これにより、GUIの応答性が維持され、アクティビティインジケーターを確認できます。
メインスレッドでは、アクティビティインジケーターを表示するために、次のようなものが必要です。
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];
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()
activityIndicator wirte [activityIndicator stopAnimating]
を適切な場所で停止するには
活動インジケーターの中心を次のように変更します
activityIndicator.center = self.view.center;
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);
タスクを開始する前に、次のコードを追加してください:
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];
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()
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()
})
}
他のいくつかの回答の問題は、サブアクティビティが蓄積し始めるように毎回新しいアクティビティインジケーターが追加されることです。以下は、単一の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()
})
})
}
}
/ 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にインジケーターを追加し、要件に基づいて非表示/再表示にすることです。
spinner.center = self.view.center;
RootControllerからスピナーを表示するには、以下を試してください。
[self.navigationController.visibleViewController.view addSubview:spinner];
または
[self.navigationController.view addSubview:spinner];
このようにしてみてください
activityIndicator.center = CGPointMake(160,240);