Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.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
Iphone iOS7-状态栏下的视图-edgesForExtendedLayout不工作_Iphone_Ios_Objective C_Xcode_Ios7 - Fatal编程技术网

Iphone iOS7-状态栏下的视图-edgesForExtendedLayout不工作

Iphone iOS7-状态栏下的视图-edgesForExtendedLayout不工作,iphone,ios,objective-c,xcode,ios7,Iphone,Ios,Objective C,Xcode,Ios7,我有一个去年建立的项目,它使用XIB,没有故事板。XIB不使用自动布局,但它们使用一些自动调整大小。我在运行iOS7时遇到了一个问题,其中所有视图都隐藏在状态栏下。我完全理解这是iOS7的一个新特性,这是可以预料的。但是,所有解决方案都无法解决这一问题。我在视图的顶部有一个图像,它总是显示在状态栏下,我没有使用导航栏或类似的东西 我尝试过更新XIB中的Y形三角洲(它们对视图没有影响),尝试过将edgesForExtendedLayout设置为UIRectEdgeNone(不做任何事情),以及其他

我有一个去年建立的项目,它使用XIB,没有故事板。XIB不使用自动布局,但它们使用一些自动调整大小。我在运行iOS7时遇到了一个问题,其中所有视图都隐藏在状态栏下。我完全理解这是iOS7的一个新特性,这是可以预料的。但是,所有解决方案都无法解决这一问题。我在视图的顶部有一个图像,它总是显示在状态栏下,我没有使用导航栏或类似的东西

我尝试过更新XIB中的Y形三角洲(它们对视图没有影响),尝试过将
edgesForExtendedLayout
设置为
UIRectEdgeNone
(不做任何事情),以及其他许多事情。每次,无论我做什么,状态栏都会显示隐藏在其下的视图。。除非我在XIB中手动向下移动视图,以便为状态栏留出空间(但该解决方案不起作用,因为它在iOS6中看起来并不正确)

奇怪的是,即使我尝试在视图转换中破解一行代码,它也不起作用(如下所示):

…并不是说我会采用这种解决方案,但奇怪的是它不起作用(我通常唯一看到不起作用的时候是如果自动布局到位,而在这种情况下不是这样)

这是状态栏显示的一个设计要求,我只是被为什么不能将视图设置在iOS7的状态栏下的问题难住了。我已经阅读了关于这个主题的每一篇文章,以及苹果的过渡/指南。再次重申,我完全理解它应该如何运作,以及预期的解决方案应该是什么,但这些似乎都不适用于这个特定的项目

我是一个经验丰富的iOS开发人员,但是这个项目是由另一个团队构建的,所以我不知道在XIB文件、plist或代码中是否隐藏了一些可能胜过上述设置的东西。请让我知道,如果有什么,可以在这方面看,或更多的信息,我可以提供


提前谢谢

作为参考,下面的解决方案在我将其应用于ViewController时确实有效。然而,它并不理想,而且有点粗糙。如果这是我能采取的唯一方法,那么就这样吧

float systemVersion=[[[UIDevice currentDevice] systemVersion] floatValue];
if(systemVersion>=7.0f)
{
    CGRect tempRect;
    for(UIView *sub in [[self view] subviews])
    {
        tempRect = [sub frame];
        tempRect.origin.y += 20.0f; //Height of status bar
        [sub setFrame:tempRect];
    }
}

如果在Interface Builder中设置iOS 6/7增量值,请记住在Interface Builder文档中将“View as”设置为“iOS 6”,因为它是要复制的iOS 6布局。Delta将仅在iOS 7上用于将内容推送到状态栏下方。如果您将“查看方式”设置为iOS 7(默认设置),则Delta将为您提供iOS 6上的iOS 7外观

但是,如果基于图幅以编程方式重新定位或调整视图的大小,则增量将不会有帮助,因为图幅不考虑增量

我发现最好的解决方案不是使用增量,而是在主XIB上启用自动布局,然后在顶部/内容视图上设置顶部空间约束,以遵循顶部布局指南。此指南是在iOS 7中引入的,表示状态栏下方的位置。不幸的是,当不使用故事板时,Interface Builder中没有该指南,但您可以通过编程方式添加它

我所做的是在Interface Builder中将顶部空间约束添加到superview,并在代码中为此创建了一个出口。然后,在viewDidLoad中,如果topLayoutGuide可用(iOS 7+),则将此插座中的约束替换为使用Top Layout Guide的版本

if ([self respondsToSelector:@selector(topLayoutGuide)]) {
    [self.view removeConstraint:self.containerTopSpaceConstraint];

    self.containerTopSpaceConstraint =
    [NSLayoutConstraint constraintWithItem:self.contentView
                                 attribute:NSLayoutAttributeTop
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:self.topLayoutGuide
                                 attribute:NSLayoutAttributeBottom
                                multiplier:1
                                  constant:0];

    [self.view addConstraint:self.containerTopSpaceConstraint];

    [self.view setNeedsUpdateConstraints];
    [self.view layoutIfNeeded];
}

苹果正在推动你使用自动布局来实现这一点。您需要在视图的顶子视图中为“顶部布局指南”设置约束

有关示例,请参见本文档:

要在没有XIB的情况下实现这一点,需要以编程方式添加约束。苹果的文档给出了一个很好的例子,我在下面总结了这个例子

假设
topLayoutGuide
是视图控制器上的一个属性,您只需在变量绑定字典中使用它。然后,您可以像设置法线一样设置约束:

id topGuide = [myViewController topLayoutGuide];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(button, topGuide);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide]-20-[button]" options:0 metrics:nil views:viewsDictionary]; 
可以找到这方面的文档。

1)如果您不介意使用不透明的导航栏,最简单的解决方案是:

self.navigationController.navigationBar.translucent = NO;

2) svguerin3的答案在一般情况下不起作用。例如,如果您的一个子视图使用自动调整大小来挂接在其容器的底部,则其新位置将是错误的。在最坏的情况下,它可能会退出屏幕。

您是否尝试过将您的XIB视为源并删除任何包含edgesforextendedlayout

- (void)viewDidAppear:(BOOL)animated {
        [self.view setFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height)];
// OR
        self.view.transform = CGAffineTransformMakeTranslation(0, 20);
}
我们必须删除故事板场景中的这条线,因为故事板场景的主视图由XIB表示

我们所经历的是,在某些场景中,场景主视图的XIB内容被状态栏和导航栏的高度向下推

删除该行后,可以显示XIB,就好像它们的顶部位于故事板场景的同一顶部一样

遗憾的是,我们不知道是什么触发了这一点,但我在更改XIB主视图中内容的顺序时看到了这种情况,以便首先出现UITextView。触发后重新排列项目顺序对消除这种不必要的行为没有任何效果


希望这能帮助其他遇到此类问题的人。

如果您正在使用故事板,在设置视图的顶部布局后,您可以在属性检查器中取消选中“不透明条下”


嘿,你有什么解决办法吗?我也面临着同样的问题。有人提出了解决方案吗?如果您使用的是XIB,则无法从Interface Builder对顶部布局指南设置约束,只有在您使用的是故事板的情况下。所以问题仍然是,如何以编程方式创建此约束?@PhillApley请参阅我编辑的答案,了解如何创建此约束
- (void)viewDidAppear:(BOOL)animated {
        [self.view setFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height)];
// OR
        self.view.transform = CGAffineTransformMakeTranslation(0, 20);
}