(转)Three20研究院之自制IOS顶部状态栏详解

IOS状态栏是什么地方? 它是IOS设备屏幕顶部显示信号以及电池的区域。状态栏默认的高度是20像素,状态栏在软件开发中有何作用?联网应用中可在自动帮用户下载数据时使用,推荐在状态栏中予以显示。状态栏可以通过程序来控制隐藏与显示,也可以在状态栏之上添加Loading的动画,让用户感觉目前正处于下载状态中。下面我们先学习最简单的一种,就是在状态栏之上添加下载的Loading动画。如下图所示,在屏幕顶部状态栏中,信号图标旁边已经出现动画Loading的标志,它目前正在一直转圈。另外,本篇文章适用于普通IOS软件开发与Three20软件开发。

 

 

动画显示与隐藏的代码很简单,如下所示:

//开启状态栏动画
[[UIApplication sharedApplication]         setNetworkActivityIndicatorVisible:YES];
//关闭状态栏动画
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

这样的动画确实有点局限,不能修改动画的位置,我们可以将整个状态栏利用起来。写一个新视图覆盖至原有状态栏视图之上,在新视图中写入需要的东西。在学习它之前我们先学习如何隐藏与显示状态栏。

状态栏显示与隐藏的代码很简单,如下所示:

 

//隐藏状态栏
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:YES];
	 
//显示状态栏
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:YES];

setStatusBarHidden :表示状态栏显示与隐藏。

withAnimation:表示是否播放显示与隐藏的过渡动画。

        别高兴的太早,它仅仅只是隐藏状态栏,所以屏幕顶部还是会空留20像素的白条,为了让显示上更佳彻底,需要继续重新设定整个窗口的显示区域以及标题栏的位置:

//隐藏状态栏
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:YES];
//重新设定窗口的显示区域
[[UIApplication sharedApplication].keyWindow setFrame:CGRectMake(0, 0, 320, 480)];
//重新设定标题栏显示的位置
[self.navigationController.navigationBar setFrame:CGRectMake(0, 0, 320, 44)];

如下图所示,状态条已经完全去掉,包括顶部的白条,是不是很神奇呢?

下面学习本文的重点内容,重写状态栏内容。如下图所示,状态栏顶部已经写入读取进度的百分比,为了让效果更佳好,在状态栏顶部将绘制进度条以及下载进度的百分比。在状态栏左侧将绘制读取动画,一个圆圈不停的转啊转啊的。嘎嘎~

 

 

下面开始详细的代码介绍。

ViewController.h

#import <Three20/Three20.h>
	 
	@interface ViewController : TTViewController
	{
	    //下载进度显示视图
	    UITextView*textView;
	    //状态条顶部Loading动画视图
	    UIActivityIndicatorView *activity;
	    //计时器
	    NSTimer *timer;
	    //应用程序的句柄
	    UIApplication *app;
	    //计数
	    int timeCount;
	}
	@end


ViewController.m

 

#import "ViewController.h"
	 
	@implementation ViewController
	 
	- (void)viewDidLoad
	{
	    [super viewDidLoad];
	 
	    //设置标题栏文字
	    self.title =@"雨松MOMO软件开发";
	    //设置视图背景显示颜色
	    [self.view setBackgroundColor:[UIColor blackColor]];
	 
	    //创建图片视图
	    TTImageView *imageview = [[[TTImageView alloc] initWithFrame:
	                               CGRectMake(100, 50, 120, 120)] autorelease]; 
	 
	    //设置图片视图显示的图片资源
	    imageview.defaultImage = TTIMAGE(@"bundle://0.jpg");
	    //将图片视图加入整个视图当中
	    [self.view addSubview:imageview];
	 
	    //按钮的文字信息
	    NSArray *titles = [[NSArray alloc] initWithObjects:
	                       @"隐藏状态栏",
	                       @"显示状态栏",
	                       @"更新状态栏",
	                       nil];
	 
	    for (int i =0; i < [titles count]; i++)
	    {
	 
	        //创建普通按钮
	        UIButton *button = [UIButton buttonWithType:1];
	        //设置按钮位置
	        button.frame = CGRectMake(0, 200 + i * 40, 320, 30);
	        //设置按钮现实文字
	        [button setTitle:[titles objectAtIndex:i] forState:UIControlStateNormal];
	        //设置按钮标记
	        button.tag = i;
	        //设置按钮点击后 绑定响应方法
	        [button addTarget:self action:@selector(ButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
	        //将按钮添加入视图中
	        [self.view addSubview: button];
	    }
	 
	    //得到应用程序的句柄
	    app = [UIApplication sharedApplication];
	 
	}
	 
	-(void)ButtonPressed:(id)buttonID
	{
	    //获取点击的按钮
	    UIButton *button = (UIButton *)buttonID;
	    switch (button.tag)
	    {
	        case 0:
	            //注解1
	            [app setStatusBarHidden:YES withAnimation:YES];
	            [app.keyWindow setWindowLevel:UIWindowLevelStatusBar];
	            [app.keyWindow setFrame:CGRectMake(0, 0, 320, )];
	            break;
	        case 1:
	            //注解2
	            [app setStatusBarHidden:NO withAnimation:YES];
	            [app.keyWindow setWindowLevel:UIWindowLevelStatusBar];
	            [app.keyWindow setFrame:CGRectMake(0, 20, 320, )];
	            break;
	        case 2:
	            //注解3
	            [app setStatusBarHidden:NO withAnimation:YES];
	            [app.keyWindow setWindowLevel:UIWindowLevelStatusBar];
	            [app.keyWindow setFrame:CGRectMake(0, 20, 320, )];
	            [self performSelector:@selector(startUpdate) withObject:nil afterDelay:0.4];
	            break;
	 
	    }
	 
	    //注解4
	    [self.navigationController.navigationBar setFrame:CGRectMake(0, 0, 320, 44)];
	 
	}
	 
	- (void)dealloc
	{
	    //释放
	    TT_RELEASE_SAFELY(textView);
	    TT_RELEASE_SAFELY(activity);
	    TT_RELEASE_SAFELY(timer);
	    TT_RELEASE_SAFELY(app);
	    [super dealloc];
	}
	 
	- (void) startUpdate
	{
	    if(timer == nil)
	    {
	        //顶部文本视图
	        textView = [[UITextView alloc] initWithFrame:CGRectMake(0, -25, 320, 25)];
	        [textView setBackgroundColor:[UIColor blackColor]];
	        [textView setText:@"开始更新"];
	        [textView setTextColor:[UIColor whiteColor]];
	        [textView setTextAlignment:UITextAlignmentCenter];
	        [textView setFont:[UIFont systemFontOfSize:15]];
	        [app.keyWindow addSubview:textView];
	 
	        //注解5
	        [UIView beginAnimations:@"anim1" context:nil];
	        [UIView setAnimationDuration:1.0];
	        textView.alpha = 0.0f;
	        textView.alpha = 1.0f;
	        [UIView commitAnimations];
	 
	        [textView release];
	 
	        //注解6
	        timer = [NSTimer scheduledTimerWithTimeInterval: 0.1
	                                                 target: self
	                                               selector: @selector(handleTimer:)
	                                               userInfo: nil
	                                                repeats: YES];
	        //开始播放loading动画
	        [self addLoading];
	 
	    }
	}
	- (void) handleTimer: (NSTimer *) t
	{
	    //开始计数,没进该方法一次++
	    timeCount++;
	    //计数器小于100表示未下载完毕
	    if(timeCount <=100)
	    {
	        //绘制显示百分比
	        NSString *text = [NSString stringWithFormat:@"读取进度百分之:%d ",timeCount];
	        [textView setText:text];
	    }else
	    {
	 
	        //计数器大于100表示下载完毕
	        [textView setText:@"读取完毕"];
	        timeCount = 0;
	        //删除时间计时器
	        [self removeTimer];
	        //删除读取动画
	        [self removeLoading];
	 
	        //注解7
	        [UIView beginAnimations:@"anim" context:nil];
	        [UIView setAnimationDuration:1.0];
	        textView.alpha= 1.0f;
	        textView.alpha = 0.0f;
	        [UIView commitAnimations];
	    }
	}
	 
	- (void)addLoading
	{
	    //创建Loading动画视图
	    activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
	    //设置动画视图的风格,这里设定它位白色
   activity.activityIndicatorViewStyle=UIActivityIndicatorViewStyleWhite;
	    //设置它显示的区域
	    activity.frame = CGRectMake(0, -18, 20, 18);
	    //将视图加入窗口中
	    [app.keyWindow addSubview:activity];
	    //开始播放动画
	    [activity startAnimating];
	    //释放
	    [activity release];
	 
	}
	 
	-(void)removeLoading
	{
	    //结束动画
	    [activity stopAnimating];
	    //删除动画视图
	    [activity removeFromSuperview];
	}
	 
	-(void)removeTimer
	{
	    //停止时间计时器
	    TT_INVALIDATE_TIMER(timer);
	 
	//等价于上面的方法
	//    //停止时间计时器
	//    [timer invalidate];
	//    //让它等于nil
	//    timer = nil;
	 
	}
	 
	@end

注解1:setStatusBarHidden:YES设定状态栏的隐藏,隐藏状态栏后,为了让下方原有的视图自动向上移动,那么就需要重新设定窗口的等级与显示区域。使用setWindowLevel方法可设定窗口的等级,窗口等级可分为三种:普通窗口,警告窗口,状态栏窗口,所以这里我们设定窗口等级为UIWindowLevelStatusBar(状态栏窗口)。窗口等级设定完毕后紧接着需要重新设定窗口的显示区域,重新设定窗口的显示区域为CGRect(0,0,320,480),表示新的窗口将完整填充整个手机屏幕。

注解2:状态栏的显示与状态栏的隐藏是一个道理,setStatusBarHidden:NO 设置状态栏可见,继续设定窗口的等级与显示区域。因为状态栏的高度为20,所以现在设定窗口的显示区域为CGRect(0,20,320,460),可保持视不包含状态栏的20像素高度,视图将填充下方整个屏幕。

注解3:在这里我们需要将新的视图覆盖至状态栏之上,首先是隐藏状态栏,隐藏时由于开启了隐藏状态栏的动画,所以延迟0.4毫秒等状态按彻底隐藏后在将新的视图覆盖至状态栏之上。使用performSelector方法,参数1表示延迟一段时间后执行的方法,参数2表示附带一个对象,参数3表示延迟的时间。这里是延迟0.4毫秒后执行startUpdate方法,下载属于以及更新视图都写在该方法中。

注解4:重新设定标题栏的位置,这个一定要设定,否则由于修改窗口的显示区域后标题栏显示上会出现偏差。

注解5:实现视图切换淡入淡出的效果,beginAnimations方法表示即将开始播放一段动画,setAnimationDuration方法表示设定动画播放的长度,textView.alpha表示设定视图的透明度,这里设定了2个透明度,0.0表示完全透明,1.0表示完全不透明,当然还可继续设定更多的视图变化,这段动画的含义是在1秒内现实视图从完全透明到完全不透明。最后执行[UIView commitAnimations]方法才是真正的开始播放动画,请大家记住beginAnimations 与commitAnimations两个方法必需成对儿出现,视图的任何变化都需要写在两个方法之间。

注解6:NSTimer表示时间计数器,它的原理就是在程序中新开一个子线程,并且子线程将每隔一段时间执行一次。本节我们使用它模拟用户下载数据的时间。这段代码表示程序将每隔0.1秒执行一次handleTimer方法,在handleTimer方法中去更新状态栏视图显示的文字,下载百分比。数据下载完毕后关闭视图,播放淡入淡出动画并且恢复原有状态栏。


最后在说说Three20中3个比较常用释放对象的宏定义:

#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
	#define TT_INVALIDATE_TIMER(__TIMER) { [__TIMER invalidate]; __TIMER = nil; }
	 
	// Release a CoreFoundation object safely.
	#define TT_RELEASE_CF_SAFELY(__REF) { if (nil != (__REF)) { CFRelease(__REF); __REF = nil; } }


TT_RELEASE_SAFELY() :表示释放对象,并且将该对象赋值为nil。

TT_INVALIDATE_TIMER():停止时间计数器,并且将该计数器赋值为nil。

TT_RELEASE_CF_SAFELY:检测对象是否为nil,如果不为nil释放对象,最后赋值为nil。

最后欢迎各位盆友可以和MOMO一起讨论Three20软件开发,如果你觉得看得不清楚,MOMO附带上本章的源码下载,希望大家可以一起学习 哈哈~。哇咔咔~ MOMO愿和 大家好好学习,大家一起进步哈~!!!



(下载后必需搭建three20环境成功后才能运行~ 因为three20为引用加载,所以程序路径都是我本机的请见谅!或者你可可以将你的Three20路径修改的和我一样就可以直接运行啦,我的路径是:User (用户) -> Share(共享)->Three20)。

转载于:https://my.oschina.net/yongbin45/blog/63150

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值