StatusBar,状态栏 ,UIWindow

1. 实现状态栏点击

    使用在Apple的View Programming Guide for iOS文档里提到的更改Window Level这个技巧。

typedef CGFloat UIWindowLevel;
const UIWindowLevel UIWindowLevelNormal; // 0.0
const UIWindowLevel UIWindowLevelAlert; // 2000.0
const UIWindowLevel UIWindowLevelStatusBar; // 1000.0

    可以看出系统弹出来的对话框的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.


你可能感兴趣的:(ios)