如何以编程方式在iPhone应用程序中添加一个简单的默认加载(进度)栏

时间:2012-04-02 12:18:33

标签: iphone ios

我在My iPhone应用中使用http通讯。我想在从服务器加载数据时显示进度条。我该如何以编程方式完成?

我只想要一个默认的进度条。没有什么花哨的东西,比如我们做ProgressDialog.show();的机器人,是否有任何一个用于显示iphone进度条的衬垫?

17 个答案:

答案 0 :(得分:80)

UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
indicator.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
indicator.center = self.view.center;    
[self.view addSubview:indicator];
[indicator bringSubviewToFront:self.view];
[UIApplication sharedApplication].networkActivityIndicatorVisible = TRUE;

如果要显示指标

,请在下面写下代码
[indicator startAnimating];

如果要隐藏指标

,请在下面写下代码
[indicator stopAnimating];

答案 1 :(得分:11)

我建议使用NSURLConnection。您需要的方法是:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
  [self.resourceData setLength:0];
  self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
  [self.resourceData appendData:data];
  NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.resourceData length]];
  self.progressBar.progress = [resourceLength floatValue] / [self.filesize floatValue];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
  self.progressBar.hidden = YES;
}

头文件:

@property (nonatomic, retain) UIProgressView *progressBar;
@property (nonatomic, retain) NSMutableData *resourceData;
@property (nonatomic, retain) NSNumber *filesize;

希望有所帮助

答案 2 :(得分:9)

为了保持这个问题的完全更新,我已经将@ enrique7mc的答案翻译为Swift3.0,并将其翻译成@ Hiren的答案。

var indicator: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
indicator.frame = CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)
indicator.center = view.center
view.addSubview(indicator)
indicator.bringSubview(toFront: view)
UIApplication.shared.isNetworkActivityIndicatorVisible = true

启动和停止进度条与@ enrique7mc指出的方式相同。

indicator.startAnimating()
indicator.stopAnimating()

答案 3 :(得分:6)

UIProgressView是您要找的课程:Apple Docs

您需要使用setProgress:animated:方法更新显示的进度。最有可能处理从网络接收的数据。

答案 4 :(得分:6)

您可以使用IOS内置UIProgressView。以下是代码段:

UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
[self.view addSubview:progressView];
[progressView setProgress:50.0];

您可以使用setFrame:在视图上定位进度条。

答案 5 :(得分:5)

尝试以下代码

float progress;

//components
UIProgressView *progressBar;
progressBar=[[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleDefault];
[progressBar setFrame:CGRectMake(30.0, 75.0, 200.0, 80.0)];

int prog=progress*100;
progressStr=[NSString stringWithFormat:@"%d%%",prog];
[progressBar setProgress:progress];

答案 6 :(得分:4)

我知道这是一个较旧的问题,但我已根据上述答案从任何视图编写了一个全局静态方法来执行此类事情。

主要更新是:

  • 支持活动指示器后面的可选不透明覆盖
  • 使用活动指示器的默认框架大小调整
  • 使用.WhiteLarge指示器样式

在我的AppHelper.swift中:

static func showActivityIndicator(view: UIView, withOpaqueOverlay: Bool) {

    // this will be the alignment view for the activity indicator
    var superView: UIView = view

    // if we want an opaque overlay, do that work first then put the activity indicator within that view; else just use the passed UIView to center it
    if withOpaqueOverlay {
        let overlay = UIView()
        overlay.frame = CGRectMake(0.0, 0.0, view.frame.width, view.frame.height)
        overlay.layer.backgroundColor = UIColor.blackColor().CGColor
        overlay.alpha = 0.7
        overlay.tag = activityIndicatorOverlayViewTag

        overlay.center = superView.center
        overlay.hidden = false
        superView.addSubview(overlay)
        superView.bringSubviewToFront(overlay)

        // now we'll work on adding the indicator to the overlay (now superView)
        superView = overlay
    }

    let indicator: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge)

    indicator.center = superView.center
    indicator.tag = activityIndicatorViewTag
    indicator.hidden = false

    superView.addSubview(indicator)
    superView.bringSubviewToFront(indicator)

    indicator.startAnimating()

    // also indicate network activity in the status bar
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true
}

static func hideActivityIndicator(view: UIView) {

    // stop the network activity animation in the status bar
    UIApplication.sharedApplication().networkActivityIndicatorVisible = false

    // remove the activity indicator and optional overlay views
    view.viewWithTag(activityIndicatorViewTag)?.removeFromSuperview()
    view.viewWithTag(activityIndicatorOverlayViewTag)?.removeFromSuperview()
}

答案 7 :(得分:2)

试试MBProgressHUD

这很简单,有几个进度动画选项,并且能够添加一些自定义。它显示全屏。它应该适用于任何最新的iOS版本。

或者尝试LDProgressView如果你想要更有趣的东西:)它看起来像OSX进度条。

答案 8 :(得分:1)

Swift 5.x版本

导入UIKit

class SKLoader: NSObject {
    
    static let sharedInstance = SKLoader()

    let indicator: UIActivityIndicatorView? = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.medium)

    let screen = UIScreen.main.bounds

    var appDelegate: SceneDelegate {
        guard let sceneDelegate = UIApplication.shared.connectedScenes
            .first!.delegate as? SceneDelegate else {
                fatalError("sceneDelegate is not UIApplication.shared.delegate")
        }
        return sceneDelegate
    }
    
    var rootController:UIViewController? {
        guard let viewController = appDelegate.window?.rootViewController else {
            fatalError("There is no root controller")
        }
        return viewController
    }
    
    func show() {
        indicator?.frame = CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)
        indicator?.frame.origin.x = (screen.width/2 - 20)
        indicator?.frame.origin.y = (screen.height/2 - 20)
        rootController?.view.addSubview(indicator!)
        indicator?.startAnimating()
    }
    
    func hide() {
        DispatchQueue.main.async {
            self.indicator?.stopAnimating()
            self.indicator?.removeFromSuperview()
        }
    }
}

样品用量:

//要显示

SKLoader.sharedInstance.show()

//隐藏

SKLoader.sharedInstance.hide()

=======

答案 9 :(得分:1)

@hiren对Swift4.0的答案翻译

let indicator: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorView.Style.gray)
        indicator.frame = CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)
        indicator.center = view.center
        view.addSubview(indicator)
        indicator.bringSubviewToFront(view)
        UIApplication.shared.isNetworkActivityIndicatorVisible = true


indicator.startAnimating()
indicator.stopAnimating()

答案 10 :(得分:1)

@ enrique7mc解决方案的Swift 3版本

    var indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
    indicator.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
    indicator.center = view.center
    view.addSubview(indicator)
    indicator.bringSubview(toFront: view)
    UIApplication.shared.isNetworkActivityIndicatorVisible = true


    indicator.startAnimating()
    indicator.stopAnimating()

答案 11 :(得分:1)

我想发布一个我创建的解决方案,它会在一个单独的窗口中显示一个进度条,以显示可以列出的结果的进度。

附件是下面的图片。

enter image description here

兼容性:Swift 3

特点:线程代码转换&取消+完成按钮。如果需要updateProgress功能,则自动显示剩余进度金额。

代码非常简单易于修改,只是一个故事板和一个viewcontroller。

  1. 使用下面的XML,并在项目的某处保存我建议的最终名称。
  2. <强> ProgressWindow.storyboard

    <?xml version="1.0" encoding="UTF-8"?>
    <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
        <device id="retina4_7" orientation="portrait">
            <adaptation id="fullscreen"/>
        </device>
        <dependencies>
            <deployment identifier="iOS"/>
            <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11524"/>
            <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
            <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
        </dependencies>
        <scenes>
            <!--Progress-->
            <scene sceneID="5gE-ws-FsC">
                <objects>
                    <viewController storyboardIdentifier="progressWindow" title="Progress" id="IB9-Dc-dCV" customClass="ProgressWindowViewController" customModule="WorkOrders" customModuleProvider="target" sceneMemberID="viewController">
                        <layoutGuides>
                            <viewControllerLayoutGuide type="top" id="Lvc-9P-nmJ"/>
                            <viewControllerLayoutGuide type="bottom" id="xJS-yG-jWM"/>
                        </layoutGuides>
                        <view key="view" contentMode="scaleToFill" id="iDk-68-mde">
                            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                            <subviews>
                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Please Wait..." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9ui-W7-ucD">
                                    <rect key="frame" x="16" y="84" width="343" height="21"/>
                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                    <nil key="highlightedColor"/>
                                </label>
                                <progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ov7-yH-A5z">
                                    <rect key="frame" x="16" y="113" width="343" height="2"/>
                                </progressView>
                                <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" editable="NO" text="Starting Up..." textAlignment="natural" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bwA-YT-FcE">
                                    <rect key="frame" x="16" y="123" width="343" height="464"/>
                                    <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                    <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
                                </textView>
                                <navigationBar contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="RPs-Mo-Cfx">
                                    <rect key="frame" x="-4" y="20" width="383" height="44"/>
                                    <items>
                                        <navigationItem title="Starting Sync..." id="Y87-LY-5o5">
                                            <barButtonItem key="rightBarButtonItem" title="Cancel" id="AD3-in-E6j">
                                                <connections>
                                                    <action selector="cancelNavItemButtonActionWithSender:" destination="IB9-Dc-dCV" id="IF1-MG-v2x"/>
                                                </connections>
                                            </barButtonItem>
                                        </navigationItem>
                                    </items>
                                </navigationBar>
                                <button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="6lh-KK-lX1">
                                    <rect key="frame" x="113" y="595" width="150" height="42"/>
                                    <fontDescription key="fontDescription" type="system" pointSize="25"/>
                                    <state key="normal" title="Done"/>
                                    <state key="disabled" title="Please Wait..."/>
                                    <connections>
                                        <action selector="doneButtonActionWithSender:" destination="IB9-Dc-dCV" eventType="touchUpInside" id="KQH-Th-NAC"/>
                                    </connections>
                                </button>
                            </subviews>
                            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            <constraints>
                                <constraint firstAttribute="leadingMargin" secondItem="ov7-yH-A5z" secondAttribute="leading" id="9Gm-bd-GY6"/>
                                <constraint firstItem="xJS-yG-jWM" firstAttribute="top" secondItem="bwA-YT-FcE" secondAttribute="bottom" constant="20" id="CT1-0k-Skt"/>
                                <constraint firstItem="6lh-KK-lX1" firstAttribute="top" secondItem="bwA-YT-FcE" secondAttribute="bottom" constant="8" symbolic="YES" id="Fb8-eP-lxu"/>
                                <constraint firstItem="RPs-Mo-Cfx" firstAttribute="leading" secondItem="iDk-68-mde" secondAttribute="leadingMargin" constant="-20" id="JSY-Na-oAF"/>
                                <constraint firstItem="xJS-yG-jWM" firstAttribute="top" secondItem="6lh-KK-lX1" secondAttribute="bottom" constant="30" id="NHY-fO-W26"/>
                                <constraint firstAttribute="trailingMargin" secondItem="RPs-Mo-Cfx" secondAttribute="trailing" constant="-20" id="QxH-pj-oOA"/>
                                <constraint firstItem="RPs-Mo-Cfx" firstAttribute="top" secondItem="Lvc-9P-nmJ" secondAttribute="bottom" id="VIf-63-vaw"/>
                                <constraint firstAttribute="trailingMargin" secondItem="bwA-YT-FcE" secondAttribute="trailing" id="WxH-hu-ZVQ"/>
                                <constraint firstAttribute="leadingMargin" secondItem="bwA-YT-FcE" secondAttribute="leading" id="XEd-Ba-ZfL"/>
                                <constraint firstItem="bwA-YT-FcE" firstAttribute="top" secondItem="ov7-yH-A5z" secondAttribute="bottom" constant="8" id="Xjr-bH-ILB"/>
                                <constraint firstItem="6lh-KK-lX1" firstAttribute="centerY" secondItem="iDk-68-mde" secondAttribute="centerY" id="ZU1-pD-czP"/>
                                <constraint firstItem="ov7-yH-A5z" firstAttribute="top" secondItem="9ui-W7-ucD" secondAttribute="bottom" constant="8" symbolic="YES" id="avI-Ab-G29"/>
                                <constraint firstAttribute="leadingMargin" secondItem="9ui-W7-ucD" secondAttribute="leading" id="dse-zV-g00"/>
                                <constraint firstItem="6lh-KK-lX1" firstAttribute="centerX" secondItem="iDk-68-mde" secondAttribute="centerX" id="i5Q-oY-DdV"/>
                                <constraint firstAttribute="trailingMargin" secondItem="9ui-W7-ucD" secondAttribute="trailing" id="jqu-1f-IuA"/>
                                <constraint firstItem="9ui-W7-ucD" firstAttribute="top" secondItem="RPs-Mo-Cfx" secondAttribute="bottom" constant="20" id="nrH-ey-Zcm"/>
                                <constraint firstAttribute="trailingMargin" secondItem="ov7-yH-A5z" secondAttribute="trailing" id="qha-Es-6Au"/>
                            </constraints>
                            <variation key="default">
                                <mask key="constraints">
                                    <exclude reference="ZU1-pD-czP"/>
                                    <exclude reference="CT1-0k-Skt"/>
                                </mask>
                            </variation>
                        </view>
                        <connections>
                            <outlet property="cancelNavButton" destination="AD3-in-E6j" id="SJc-Bc-N6j"/>
                            <outlet property="currentProgressLabel" destination="9ui-W7-ucD" id="zij-yQ-MFX"/>
                            <outlet property="doneButton" destination="6lh-KK-lX1" id="rh2-RF-4ak"/>
                            <outlet property="navItemLabel" destination="Y87-LY-5o5" id="ijO-a7-TrD"/>
                            <outlet property="navigationBar" destination="RPs-Mo-Cfx" id="WEq-F4-Pup"/>
                            <outlet property="theProgressBar" destination="ov7-yH-A5z" id="FUE-9J-iBh"/>
                            <outlet property="theTextView" destination="bwA-YT-FcE" id="1sR-23-NZH"/>
                        </connections>
                    </viewController>
                    <placeholder placeholderIdentifier="IBFirstResponder" id="TH6-NB-Eos" userLabel="First Responder" sceneMemberID="firstResponder"/>
                </objects>
                <point key="canvasLocation" x="-492" y="1474"/>
            </scene>
        </scenes>
    </document>
    
    1. 将以下代码保存到项目中,名称为ProgressWindowViewController.swift
    2. <强> ProgressWindowViewController.swift

      import UIKit
      
      protocol progressWindowDelegate : class{
          var titleToGive : String {get}
          func codeToRun(progressWindowViewController:ProgressWindowViewController)
          var codeToCancel : ()->() {get}
      }
      
      
      class ProgressWindowViewController: UIViewController {
      
          @IBOutlet weak var theTextView: UITextView!
          @IBOutlet weak var currentProgressLabel: UILabel!
          @IBOutlet weak var theProgressBar: UIProgressView!
          @IBOutlet weak var navItemLabel: UINavigationItem!
          @IBOutlet weak var doneButton: UIButton!
          @IBOutlet weak var cancelNavButton: UIBarButtonItem!
          @IBOutlet weak var navigationBar: UINavigationBar!
      
          //For showing network activity
          var indicator: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
      
          //Sets delegate
          weak var controllerDelegate:progressWindowDelegate? = nil
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              navItemLabel.title = controllerDelegate!.titleToGive
      
              //Run on the main thread first then in background thread.
              DispatchQueue.main.async {
                  DispatchQueue.global(qos: .background).async{
                      self.controllerDelegate?.codeToRun(progressWindowViewController: self)
                  }
              }
      
          }
      
          override func didReceiveMemoryWarning() {
              super.didReceiveMemoryWarning()
              // Dispose of any resources that can be recreated.
          }
      
          func writeToProgressWindow(text:NSMutableAttributedString){
              DispatchQueue.main.async(execute: {
                  print("dispatch_queue_get_main_queue -> writeToProgressWindow()")
                  self.theTextView.attributedText = text
              })
          }
      
          func updateNetworkIndicator(active:Bool){
              DispatchQueue.main.async(execute: {
                  if(active){
                      UIApplication.shared.isNetworkActivityIndicatorVisible = true
                  }else{
                      UIApplication.shared.isNetworkActivityIndicatorVisible = false
                  }
              })
          }
      
          func updateProgress(updatetext:String,amount:Int,left:Int){
              DispatchQueue.main.async(execute: {
                  print("dispatch_queue_get_main_queue -> updatingProgress()")
                  self.currentProgressLabel.text = updatetext+" : \(amount) / \(left)"
                  self.theProgressBar.setProgress(Float(amount/left), animated: true) //progress is represented as a percentage of the total
              })
          }
      
          func updateProgressWindowWeFinished(title:String){
              //Enable done button and Disable/Hide Cancel Button.  Add Final Messages
              DispatchQueue.main.async(execute: {
                  self.doneButton.isEnabled = true
                  self.navItemLabel.title = title
                  self.cancelNavButton.isEnabled = false
                  self.cancelNavButton.tintColor = UIColor.clear
              })
          }
      
          @IBAction func cancelNavItemButtonAction(sender: UIBarButtonItem) {
              //Run on the main thread first then in background thread.
              DispatchQueue.main.async {
                  DispatchQueue.global(qos: .background).sync{
                      print("dispatch_queue_priority_default")
                      self.controllerDelegate?.codeToCancel()
                  }
                  self.dismiss(animated: true, completion: nil)//closes the window.
              }
          }
      
      
          @IBAction func doneButtonAction(sender: UIButton) {
              self.dismiss(animated: true, completion: nil)//closes the window.
          }
      
          /*
          // MARK: - Navigation
      
          // In a storyboard-based application, you will often want to do a little preparation before navigation
          override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
              // Get the new view controller using segue.destinationViewController.
              // Pass the selected object to the new view controller.
          }
          */
      
      }
      

      3。)使用你只需将调用它的视图控制器设置为progressWindowDelegate,并提供所需的信息以与popover进行通信。

      enter image description here

      如果您需要,请参阅下面的一些示例代码:

      <强> SampleViewControllerWithYesButton.swift

      class SyncViewController: UIViewController, progressWindowDelegate {
      
          var codeToCancel = {print("code to cancel")}
          var titleToGive = "Starting Sync..."
      
          func codeToRun(progressWindowViewController:ProgressWindowViewController) {
              print("code to run")
          }
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              // Do any additional setup after loading the view.
          }
      
          override func didReceiveMemoryWarning() {
              super.didReceiveMemoryWarning()
              // Dispose of any resources that can be recreated.
          }
      
          @IBAction func yesButtonAction(_ sender: UIButton) {
      
      
      
      
      
      
      
                  let storyboard = UIStoryboard(name: "ProgressWindow", bundle: nil)
                  let controller = storyboard.instantiateViewController(withIdentifier: "progressWindow") as! ProgressWindowViewController
                  controller.controllerDelegate = self
                  self.present(controller, animated: true, completion: nil)
      
      
          }
      
          @IBAction func noButtonAction(_ sender: UIButton) {
              tabBarController?.selectedIndex = 1 //Send them to the list then.
          }
      
      
          /*
          // MARK: - Navigation
      
          // In a storyboard-based application, you will often want to do a little preparation before navigation
          override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
              // Get the new view controller using segue.destinationViewController.
              // Pass the selected object to the new view controller.
          }
          */
      
      }
      

      无论你在codeToRun()中放置什么都将作为后台线程运行。要访问任何UI,codeToRun可以访问progressWindowViewController,该控件已经预先配置为与您控制的这些元素连接到UI。

      @IBOutlet weak var theTextView: UITextView!
          @IBOutlet weak var currentProgressLabel: UILabel!
          @IBOutlet weak var theProgressBar: UIProgressView!
          @IBOutlet weak var navItemLabel: UINavigationItem!
          @IBOutlet weak var doneButton: UIButton!
          @IBOutlet weak var cancelNavButton: UIBarButtonItem!
          @IBOutlet weak var navigationBar: UINavigationBar!
      

      我在所有项目中使用此功能,无论何时进行同步,上传或耗时的网络任务。

      这也显示了活动指示符以显示您正在尝试执行某些操作。所有这一切都可以定制,因为它很容易查看和理解它是如何工作的。希望这有助于节省一些时间,快速获得进度类型窗口。

答案 12 :(得分:0)

添加媒体资源

@property(强,非原子)IBOutlet UIActivityIndi​​catorView *指标;

开始制作动画

[self.indicator startAnimating];

停止制作动画

[self.indicator stopAnimating];

答案 13 :(得分:0)

@ enrique7mc的Swift代码的

Swift 5.x 版本:

var indicator: UIActivityIndicatorView = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.gray)
indicator.frame = CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)
indicator.center = view.center
view.addSubview(indicator)
indicator.bringSubviewToFront(view)
UIApplication.shared.isNetworkActivityIndicatorVisible = true

开始
indicator.startAnimating()

使用

停止
indicator.stopAnimating()

这会在屏幕中间和状态栏上添加一个小的ActivityIndicator(圆圈,Apple的documentation)。切换到其他ViewController后,第一个将被清除,而状态栏中的第一个则不会被清除-您必须手动将其禁用。

答案 14 :(得分:0)

SwiftUI版本

非常简单,不联网的基本进度指示器。 SwiftUI默认仍不支持,因此UIViewRepresentable是可行的方法。尽情享受修改内容的乐趣。

struct ActivityIndicatorView: UIViewRepresentable {
    let large: Bool
    @State var enabled: Bool

    func makeUIView(context: Context) -> UIActivityIndicatorView {
        let view = UIActivityIndicatorView(style: large ? .large : .medium)
        return view
    }

    func updateUIView(_ view: UIActivityIndicatorView, context: Context) {
        if enabled {
            view.startAnimating()
        } else {
            view.stopAnimating()
        }
    }
}

答案 15 :(得分:0)

我也会在这里投入两分钱:

我创建了这个ARSLineProgress预加载器,您也可以在Appetize上进行测试。

答案 16 :(得分:-1)

App Delegate.h

-(void)showLoader;

-(void)hideLoder;

App Delegate.m

@implementation AppDelegate

AppDelegate *app;

-(void)showLoader
{

    if(loaderView== NULL)
    {
        loaderView=[[UIView alloc] initWithFrame:self.window.frame];

        [loaderView setBackgroundColor:[UIColor blackColor]];

        [loaderView setAlpha:0.5];

        spinner = [[UIActivityIndicatorView alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

        [loaderView addSubview:spinner];

        spinner.center = CGPointMake(loaderView.frame.size.width/2-10, 

        loaderView.frame.size.height/2-10);

        spinner.hidesWhenStopped = YES;  
    }
    [spinner startAnimating];
    [self.window addSubview:loaderView];
    [self.window bringSubviewToFront:spinner];
    [self.window bringSubviewToFront:loaderView];
}

-(void)hideLoder
{       
    if (spinner!= NULL) {           
        [spinner stopAnimating];
    }

    [loaderView removeFromSuperview];
}

现在导入“AppDelegate.h”类,你想要调用loader.and你可以像这样调用加载器。

[app showLoader];

[app hideLoder];