Ios 如何以编程方式在视图中间创建活动指示器?

Ios 如何以编程方式在视图中间创建活动指示器?,ios,objective-c,cocoa-touch,uiactivityindicatorview,Ios,Objective C,Cocoa Touch,Uiactivityindicatorview,我正在使用一个在线解析提要的应用程序。当我单击刷新按钮时,需要一些时间来重新解析文件并显示其数据。当我点击刷新按钮时,我希望在视图中间有一个活动指示器。当解析完成时,该指示符应该隐藏 我正在使用此代码,但它不起作用: - (IBAction)refreshFeed:(id)sender { UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UI

我正在使用一个在线解析提要的应用程序。当我单击刷新按钮时,需要一些时间来重新解析文件并显示其数据。当我点击刷新按钮时,我希望在视图中间有一个活动指示器。当解析完成时,该指示符应该隐藏

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

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

   [spinner startAnimating];

   // parsing code code
    
   [spinner release];
}

更好的方法是在xib上添加指示器,并根据您的要求将其隐藏/取消隐藏

将活动指示器的中心更改为

activityIndicator.center = self.view.center;
要从rootController显示微调器,请尝试:

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

像这样试试

activityIndicator.center = CGPointMake(160,240);

UIActivityIndicator通常需要放置在长进程(解析提要)的单独线程中才能显示

如果您想让所有内容保持在同一个线程中,那么需要给指示器显示时间。在代码中放置延迟的地址

编辑:两年后,我认为,任何时候你利用延迟来实现某件事,你很可能是做错了。下面是我现在将如何完成此任务:

- (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];
        });
    });
}
我想我无法解释 好吧,让我们再试一次。它是导航 基于应用程序。我有桌面视图。每一个 单元格创建详细视图。关于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  *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 *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 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 stop Animating]
在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()
    })
}

波斯安先生,我的代码正在运行。但如果你想显示大的活动指示器,你可以使用它

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)

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
激活活动指示器,在我的例子中,它位于'didSelectRowAt'方法中
activityIndicator.startAnimating()
如果在动画处于活动状态时按下另一个viewController,然后弹出,您仍将看到“活动指示器”正在制作动画,因此您应该执行此操作

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

它不起作用。它是一个基于导航的应用程序。refreshFeed位于rootViewController中。我应该写self.view.center吗;活动指示器一点也不出现,它不工作。它是一个基于导航的应用程序。refreshFeed位于rootViewController中。我应该写self.view.center吗;什么不起作用?。写下更多发生的细节。你看到旋转器了吗?或者根本没有旋转器。它是一个基于导航的应用程序。并且函数refreshFeed位于rootViewController中。注意,您必须在activityIndicator.autoresizingMask=(UIViewAutoresizingFlexibleRightMargin | UIViewAutoResizingFlexibleLeLeLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin)下面包含一行代码。它不起作用。它是一个基于导航的应用程序。refreshFeed位于RootViewController中。我应该写self.view还是self.tableView;它可能不可见,可能是因为您前面有一些视图。如果您是通过xib添加它,请确保在取消隐藏它时可以编写[self.view bringsubview tofront:spinner];在哪里,RU在表/视图上添加微调器?您的xib中有什么?活动指示器未显示。它是一个基于导航的应用程序。refreshFeed在rootViewController中。嗯,不是。在主线程上添加指示器,并在后台线程中执行工作。UI应该只被主线程触动。是的,两年前我没有现在这么聪明。我已经更新了答案。它应该是
activityIndicator.center=CGPointMake([[UIScreen mainScreen]bounds].size.width/2,[[UIScreen mainScreen]bounds].size.height/2)欢迎使用SO,请完整格式化您的源代码并详细描述。
let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView.init(style: UIActivityIndicatorView.Style.medium)
//if you want a bigger activity indicator, change style from .medium to .large
activityIndicator.alpha = 1.0
view.addSubview(activityIndicator)
activityIndicator.center = view.center
activityIndicator.startAnimating()
override func viewWillAppear(_ animated: Bool) {
        if activityIndicator.isAnimating {
            activityIndicator.stopAnimating()
        }
    }