13

オンラインでフィードを解析するアプリを使用しています。更新ボタンをクリックすると、ファイルを再解析してデータを表示するのに時間がかかります。更新ボタンをクリックしたときに、ビューの中央にアクティビティインジケーターが必要です。そして、解析が完了すると、そのインジケーターは非表示になります。

私はこのコードを使用していますが、機能していません:

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

   [spinner startAnimating];

   // parsing code code
    
   [spinner release];
}
4

14 に答える 14

17

UIActivityIndi​​catorは通常、表示するために長いプロセス(フィードの解析)とは別のスレッドに配置する必要があります。

すべてを同じスレッドに保持したい場合は、インジケーターが表示される時間を与える必要があります。この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];
        });
    });
}
于 2011-02-24T10:53:13.130 に答える
13

うまく説明できないと思います。もう一度やり直してみましょう。そのナビゲーションベースのアプリ。私は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];
于 2011-02-24T11:49:57.703 に答える
7

アクティビティインジケーターの中心を次のように変更します

activityIndicator.center = self.view.center;
于 2011-02-24T10:21:37.183 に答える
7
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 stopAnimating]には適切な場所でインジケーターを動かします

于 2015-03-14T13:24:31.783 に答える
2
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);
于 2013-08-23T10:34:21.100 に答える
1

タスクを開始する前に、次のコードを追加してください。

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];
于 2013-11-05T07:42:16.600 に答える
1

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()
于 2016-02-20T01:39:25.697 に答える
0

このようにしてみてください

activityIndicator.center = CGPointMake(160,240);
于 2011-02-24T10:50:40.783 に答える
0
/ 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にインジケーターを追加し、要件に基づいて非表示/再表示を行うことです。

于 2011-02-24T10:18:44.427 に答える
0
spinner.center = self.view.center;

rootControllerからスピナーを表示するには、次のことを試してください。

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

また

[self.navigationController.view addSubview:spinner];
于 2011-02-24T10:22:12.537 に答える
0

他のいくつかの回答の問題は、新しいアクティビティインジケーターが毎回追加されるため、サブビューが積み重なっていくことです。これは、単一のを使用する完全な例です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()
            })
        })
    }
}
于 2016-07-08T18:41:26.243 に答える
0

あなたは迅速な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()
    })
}
于 2018-04-26T10:29:48.980 に答える
0

SWIFT 5

宣言

let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView.init(style: UIActivityIndicatorView.Style.medium)
//if you want a bigger activity indicator, change style from .medium to .large

ViewDidLoad
activityIndicator.alpha = 1.0
view.addSubview(activityIndicator)
activityIndicator.center = view.center

アクティビティインジケーターをアクティブにします。私の場合は`didSelectRowAt`メソッドにあります
activityIndicator.startAnimating()

アニメーションがアクティブなときに別のviewControllerにプッシュしてからポップバックすると、アクティビティインジケーターがアニメーション化されたままになるため、これを行う必要があります。

override func viewWillAppear(_ animated: Bool) {
        if activityIndicator.isAnimating {
            activityIndicator.stopAnimating()
        }
    }
于 2020-08-14T13:48:53.800 に答える
-2

Posceanさん私のコードは機能しています。しかし、あなたはそれを使うことができる活動指標の大きな出現を見せたいですか...。

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)
于 2018-04-30T09:09:37.400 に答える