Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在双状态栏下方添加UIView_Ios_Layout_Uiviewcontroller - Fatal编程技术网

Ios 如何在双状态栏下方添加UIView

Ios 如何在双状态栏下方添加UIView,ios,layout,uiviewcontroller,Ios,Layout,Uiviewcontroller,我想以编程方式在ViewController中可见部分的顶部添加一个红色矩形。我的代码是: - (void)viewDidLoad { [super viewDidLoad]; CGRect rect = self.view.frame; CGRect newFrame = CGRectMake(0.f, 0.f, rect.size.width, 200); UIView *newView = [[UIView alloc] initWithFrame:newF

我想以编程方式在ViewController中可见部分的顶部添加一个红色矩形。我的代码是:

- (void)viewDidLoad
{
    [super viewDidLoad];
    CGRect rect = self.view.frame;
    CGRect newFrame = CGRectMake(0.f, 0.f, rect.size.width, 200);
    UIView *newView = [[UIView alloc] initWithFrame:newFrame];
    newView.backgroundColor = [UIColor redColor];
    [self.view addSubview:newView];
}
当我在iPhone5模拟器中启动它时,它的工作原理与预期一致:

红色矩形的高度为400像素=200*2

但当我在模拟器的呼叫状态栏中切换,并再次启动我的应用程序时,它看起来如下所示:

绿色条的高度是80,正如预期的那样=20*2*2,但红色矩形的高度是360,而不是400!。因此红色矩形的前40个像素隐藏在绿色条的后面。我怎样才能避免它,让我的红色矩形刚好低于绿色条


其他信息:我的应用程序创建为文件->新建->项目->IOS单视图应用程序。我已关闭“使用自动布局”和“使用大小类别”复选框。

从iOS 7开始,状态栏不再自动影响应用程序的大小/布局。您的红色UIView仍然是400px高;40个像素隐藏在通话状态栏后面。如果希望UI元素尊重状态栏高度/状态的更改,则必须以编程方式进行

您可以在应用程序代理中实现application:willChangeStatusBarFrame:和/或application:didChangeStatusBarFrame来解决此问题:

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame {
    ViewController *viewController = /* reference to your view controller */;
    UIView *newView = ((UIView *)(viewController.view.subviews.firstObject)); // you should really make newView a property in ViewController so you can access it properly
    newView.frame = CGRectMake(newView.frame.origin.x, newView.frame.origin.y + CGRectGetMaxY(newStatusBarFrame), newView.frame.size.width, newView.frame.size.height);
}

答案已发布,但我有点担心您已禁用项目的自动布局。现在,如果您想支持多个屏幕尺寸/方向,这几乎是必要的。