进度条可以看到每一项任务现在的状态。例如,在下载的应用程序中有进度条,用户可以很方便地看到当前程序下载了多少,还剩下多少;QQ音乐播放器中也使用到了进度条,它可以让用户看到当前音乐播放了多少,还剩多少等。在Xamarin.iOS中也提供用户实现进度条的类,即UIProgressView。
【示例2-19】 以下将实现进度条加载的效果。具体步骤如下:
(1)创建一个Single View Application类型的工程。
(2)打开MainStoryboard.storyboard文件,对主视图进行设置。效果如图2.36所示。
需要添加的视图以及设置,如表2-12所示。
(3)打开2-9ViewController.cs文件,编写代码,实现进度条的加载。代码如下:
using System; using System.Drawing; using MonoTouch.Foundation; using MonoTouch.UIKit; using System.Threading; using System.Threading.Tasks; namespace Application { public partial class __9ViewController : UIViewController { UIProgressView progressView; float incrementBy = 0f; …… //这里省略了视图控制器的构造方法和析构方法 #region View lifecycle public override void ViewDidLoad () { base.ViewDidLoad (); // Perform any additional setup after loading the view, typically from a nib. //触摸按钮后执行的动作 buttonStartProgress.TouchUpInside += delegate { buttonStartProgress.Enabled = false; progressView.Progress = 0f; Task.Factory.StartNew(this.StartProgress); //创建一个新的任务 } ; //为主视图添加进度条对象 progressView = new UIProgressView (new RectangleF (60f, 200f, 200f, 50f)); progressView.Progress = 0f; //设置进度条的进度 incrementBy = 1f / 10f; //设置进度条进度的增量值 this.View.AddSubview(progressView); } //进度条开始加载 public void StartProgress () { float currentProgress = 0f; //判断currentProgress是否小于1,如果是,执行进度条进度的加载 while (currentProgress < 1f) { Thread.Sleep(1000); //1000毫秒后暂停当前线程 this.InvokeOnMainThread(delegate { progressView.Progress += this.incrementBy; currentProgress = this.progressView.Progress; labelStatus.Text=string.Format("Current value: {0}", Round(progressView.Progress,2)); //判断进度条的当前进度是否为1 if (currentProgress >= 1f) { labelStatus.Text = "Progress completed!"; buttonStartProgress.Enabled = true; } } ); } } …… //这里省略了视图加载和卸载前后的一些方法 #endregion } }
运行效果如图2.37所示。
在此程序中,开发者需要注意以下两个知识点。
(1)进度条进度的设置
在实例化进度条时,我们就为进度条设置了进度,使用的属性是Progress。其语法形式如下:
进度条对象.Progress=值;
其中,值是一个浮点类型的数据,它的有效范围为0~1。
(2)进度的增加
当触摸Tap to start progress!按钮时,进度条就会实现自动加载进度的功能,它是通过调用Task.Factory.StartNew()方法实现的。它的功能是创建一个StartProgress()方法的任务,即实现加载。