簡體   English   中英

如何以編程方式在視圖中間創建活動指示器?

[英]How can I create a activity indicator in middle of view programmatically?

我正在使用一個在線解析提要的應用程序。 當我單擊刷新按鈕時,重新解析文件並顯示其數據需要一些時間。 當我單擊刷新按鈕時,我希望在視圖中間有一個活動指示器。 解析完成后,該指示器應該隱藏。

我正在使用此代碼,但它不起作用:

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

   [spinner startAnimating];

   // parsing code code
    
   [spinner release];
}

UIActivityIndi​​cator 通常需要從長進程(解析提要)放到一個單獨的線程中才能出現。

如果你想把所有東西都放在同一個線程中,那么你需要給指示器時間出現。 這個 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];
        });
    });
}

我想我無法很好地解釋它。好吧,讓我們再試一次。 它是一個基於導航的應用程序。 我有 tableView。 每個單元格創建一個 detailView。 在作為 tableview 的 RootView 上有一個刷新按鈕。 當我單擊該按鈕時,它會再次解析提要。 這需要一些時間。 那個時候程序沒有響應。 解析完成后,它又可以工作了。 現在我需要那個時候的活動指示器。 我不知道如何在xib中添加。 bcz 當我打開 main.xib 並將活動指示器放在 RootViewController 中時。 它出現在整個 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

對於斯威夫特

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

在適當的地方停止 activityIndi​​cator 寫入[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()

其他一些答案的問題是每次都會添加一個新的活動指示器,因此子視圖開始堆積。 這是一個僅使用單個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()
            })
        })
    }
}

你可以寫 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()
    })
}
/ 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);

快速 5

宣言

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

查看已加載
activityIndicator.startAnimating()

激活活動指示器,在我的例子中是在 `didSelectRowAt` 方法中
activityIndicator.startAnimating()

如果您在動畫處於活動狀態時推送到另一個視圖控制器,然后彈回,您仍然會看到活動指示器動畫,因此您應該這樣做

override func viewWillAppear(_ animated: Bool) { if activityIndicator.isAnimating { activityIndicator.stopAnimating() } }

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM