iOS7 状态栏被悲剧地覆盖了

自从 iOS7 开始,UIView 貌似改成全屏的了。因此所谓的状态栏(就是显示时间和电量的那个小横条)会和我们本身的 UIView 产生重叠。然而本人借的书却是 iOS5 的,虽然惊喜地发现大部分代码都是都还是可以用的,可是出现一些小问题也在所难免。下面这段照搬自原书的代码就出现了问题:

-(void)drawRect:(CGRect)rect{
    CGRect innerBounds = CGRectInset(self.bounds, self.margin, self.margin);
    // some code for custom drawing
}

如果直接照搬原书的代码,那么绘图的效果就会是这样的。

something is wrong

绘制的图形和状态栏产生了重叠

这是因为在 iOS7 中,UIView 变成了全屏的,附加一个透明的状态栏,参考下面的天气应用。这样一来确实美观了许多,但是很多时候也会让问题更麻烦。比如原来 self.bounds 就可以指定可用的范围,可是现在我们就要把原点设置到 (0, 20),如果为了同时兼容 iOS6 和 iOS7,就必须分别设置。

transparent status bar

透明的状态栏

以下方法亲测有效:
首先在 storyboard 中找到相应的 ViewController 将 Under top bars 和 Under bottom bars 勾去,如图所示。这样可以防止我们的图像覆盖导航条。
Screen Shot 2014-02-27 at 19.01.21
然后在 drawRect 方法中,将绘图区域的原点设置到 (0, 20).

-(void)drawRect:(CGRect)rect{
    CGRect myRect = self.bounds;
    myRect.origin = CGPointMake(0.0f, 20.0f);
    myRect.size = CGSizeMake(myRect.size.width, myRect.size.height - 20.0f);
    CGRect innerBounds = CGRectInset(myRect, self.margin, self.margin);
    // code for custom drawing
}

Leave a Reply

Your email address will not be published. Required fields are marked *