用过Reeder的应该都会发现,在进行同步时,右上角会出现一个自定义的图标。而在点击它时,就会向左扩张覆盖住原状态栏,并显示同步状态。
这个设计非常巧妙,因为传统的设计在显示状态时,往往会占用掉几十像素;而在阅读时,用户非常希望主要内容能占据更多的空间。
那么这个设计是怎么实现的呢?下面就来模拟一下。
首先要说明的是,Apple并没有开放状态栏的API,所以想要改动它的话,就只能用私有API了:
还要说明的是,模拟器上也是无效的。
这种方法虽然简单,但因为用到了私有API,你的应用很可能无法在App Store上架。
此外,可用的图标有限,而你又没权限在SpringBoard.app中添加图标。
更重要的是这个图标只能加在电池图标的左边,并且无法响应触摸事件。
既然缺点那么多,我们还是另寻他法吧。
事实上在Apple的 View Programming Guide for iOS文档里就有提到更改Window Level这个技巧。
于是看看Window Level的可用值:
这个设计非常巧妙,因为传统的设计在显示状态时,往往会占用掉几十像素;而在阅读时,用户非常希望主要内容能占据更多的空间。
那么这个设计是怎么实现的呢?下面就来模拟一下。
首先要说明的是,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;