iPhone 添加状态栏图标及自定义状态栏

本文介绍了如何在iPhone上模拟Reeder应用的状态栏图标效果,通过改变Window Level覆盖原状态栏,创建UIWindow对象并调整其windowLevel来实现自定义状态栏。文章详细讲解了坐标计算和图片大小要求,并指出此方法因使用私有API可能导致应用无法上架App Store,且存在自定义状态栏必须不透明、无法处理顶部滚动和手势识别等问题。
摘要由CSDN通过智能技术生成
用过Reeder的应该都会发现,在进行同步时,右上角会出现一个自定义的图标。而在点击它时,就会向左扩张覆盖住原状态栏,并显示同步状态。
这个设计非常巧妙,因为传统的设计在显示状态时,往往会占用掉几十像素;而在阅读时,用户非常希望主要内容能占据更多的空间。
那么这个设计是怎么实现的呢?下面就来模拟一下。

首先要说明的是,Apple并没有开放状态栏的API,所以想要改动它的话,就只能用私有API了:
@interface UIApplication ()
-(void)addStatusBarImageNamed:(id)named removeOnExit:(BOOL)exit;
-(void)addStatusBarImageNamed:(id)named;
-(void)removeStatusBarImageNamed:(id)named;
@end
这里的named实际上是个NSString对象,指向/System/Library/CoreServices/SpringBoard.app中的图片,例如@"Airplain"、@"Play"等。如果你越狱了的话,可能会在这个文件夹里找到一些越狱应用的图标。
[[UIApplication sharedApplication] addStatusBarImageNamed:@"Play"];
要注意的是进入后台时,并不会自动删除图标,即使设置removeOnExit为YES也无效。所以最好的方法是自己调用removeStatusBarImageNamed:,它只能删除通过addStatusBarImageNamed:添加的图标,而不能删除系统自己显示的图标。
还要说明的是,模拟器上也是无效的。

这种方法虽然简单,但因为用到了私有API,你的应用很可能无法在App Store上架。
此外,可用的图标有限,而你又没权限在SpringBoard.app中添加图标。
更重要的是这个图标只能加在电池图标的左边,并且无法响应触摸事件。

既然缺点那么多,我们还是另寻他法吧。
事实上在Apple的 View Programming Guide for iOS文档里就有提到更改Window Level这个技巧。
于是看看Window Level的可用值:
typedef CGFloat UIWindowLevel;
const UIWindowLevel UIWindowLevelNormal; // 0.0
const UIWindowLevel UIWindowLevelAlert; // 2000.0
const UIWindowLevel UIWindowLevelStatusBar; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值