1. 实现状态栏点击
使用在Apple的View Programming Guide for iOS文档里提到的更改Window Level这个技巧。
typedef CGFloat UIWindowLevel;
const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;
可以看出系统弹出来的对话框的Window Level最高,是UIWindowLevelAlert
思路是创建一个UIWindow对象,将它的windowLevel设大于等于UIWindowLevelStatusBar,然后将覆盖在状态栏上。缺点就是触摸事件不能传递给原生状态栏了,所以滚动到顶部的效果就得自己处理了,而越狱后关于状态栏的自定义手势也失效了。
具体做法是:
(1).自定义StatusBarView继承自UIWindow;
(2).CGRect statusBarRect = {0,0,320,20};
statusBarView = [[StatusBarView alloc] initWithFrame:statusBarRect];//只要在需要它的控制器中做出它的实例,不需要添加到其它视图中。
(3).statusBarView.windowLevel =UIWindowLevelStatusBar+1;
(4).statusBarView.hidden=NO;//显示它。它默认是隐藏的。若隐藏状态栏,要同时把statusBarView隐藏。否则仍会在屏幕顶部响应触摸。
(5).在statusBarViewr的touchesBegan中处理事件。
(6).可以设置它为全透明,或者添加小图标来模拟放置小图标到状态栏上。
2.viewController.wantsFullScreenLayout=YES;//设置为全屏布局,默认为NO
在iPhone上测试viewController.view.frame,和wantsFullScreenLayout的值无关,NSLog(@"%@",NSStringFromCGRect(self.view.frame)); 结果都是{{0, 0}, {320, 460}}。
当viewController.wantsFullScreenLayout=YES;时,view左顶点和状态栏相同,即view和statuBar都开始于window左顶点上;
当viewController.wantsFullScreenLayout=NO;即默认时,view左顶点在状态栏左下,即在window中statusBar,view沿y向下依次摆放;
可以调用[[UIApplication sharedApplication] setStatusBarHidden:YES];来隐藏状态栏。
viewController.wantsFullScreenLayout设置为YES时,如果statusbar,navigationbar, toolbar是半透明的,viewController的view就会缩放延伸到它们下面。
但tabBar不在这个规则内,无论该属性是否为YES,view都不会覆盖到tabbar的下方。
3. 全屏切换,注意下面的隐藏顺序,先状态栏,再导航栏。
[[UIApplication sharedApplication] setStatusBarHidden: ![UIApplication sharedApplication].statusBarHidden withAnimation:YES];
[self.navigationController setNavigationBarHidden:!self.navigationController.navigationBarHidden animated:YES];
//用淡入淡出效果切换隐藏与显示
[[UIApplication sharedApplication] setStatusBarHidden:![UIApplication sharedApplication].statusBarHidden withAnimation:UIStatusBarAnimationFade];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.2];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
if(self.navigationController.navigationBar.alpha==0.0)
self.navigationController.navigationBar.alpha=1.0;
else
self.navigationController.navigationBar.alpha=0.0;
[UIView commitAnimations];
4.自定义状态栏参考
如何使 statusBar 点击获取事件
http://www.cocoachina.com/bbs/read.php?tid-54777.html
自定义iPhone的状态栏
http://www.keakon.net/2011/08/11/%E8%87%AA%E5%AE%9A%E4%B9%89iPhone%E7%9A%84%E7%8A%B6%E6%80%81%E6%A0%8F
一个开源的自定义状态栏
http://blog.csdn.net/favormm/article/details/7421837
https://github.com/myell0w/MTStatusBarOverlay
5.rootViewController
vs addSubview
The UIWindow
rootViewController
property is new with iOS4.
The older technique was to use addSubview
.
The new, recommended technique is to set rootViewController
.
6.在.plist中,Status bar style的值有Gray style (default),Transparent black style (alpha of 0.5),Opaque black style
设置为Opaque black style可使状态栏为黑色背景,不受导航条影响。
7.keyWindow
keyWindow指活跃的window,
iphone键盘也在一个window里,叫UITextEffectsWindow;
Alert也是一个window
window可以层叠的,各个window都可以被响应。
UIWindow* keyWindow=[UIApplication sharedApplication].keyWindow;
if([keyWindow isKindOfClass:NSClassFromString(@"_UIAlertOverlayWindow")]){}
8.