设置“;edgesForExtendedLayout=UIRectEdgeNone";不会阻止我的子视图在iOS 7中向上移动

设置“;edgesForExtendedLayout=UIRectEdgeNone";不会阻止我的子视图在iOS 7中向上移动,ios,iphone,objective-c,ios7,Ios,Iphone,Objective C,Ios7,我有一个视图控制器,它是在iOS 5时代写的,我正在尝试将它转换到iOS 7。在阅读了iOS 7过渡指南并仔细查看之后,我发现我需要将新的iOS 7属性edgesForExtendedLayout设置为UIRectEdgeNone,以防止我的一个自定义子视图在iOS 7上比iOS 6上高49像素。然而,在设置了该属性之后,我的自定义子视图在iOS 7上仍然显示高出49像素,我不知道我还需要做什么。下面是我添加到viewDidLoad方法中的简单代码 if ([[[UIDevice current

我有一个视图控制器,它是在iOS 5时代写的,我正在尝试将它转换到iOS 7。在阅读了iOS 7过渡指南并仔细查看之后,我发现我需要将新的iOS 7属性
edgesForExtendedLayout
设置为
UIRectEdgeNone
,以防止我的一个自定义子视图在iOS 7上比iOS 6上高49像素。然而,在设置了该属性之后,我的自定义子视图在iOS 7上仍然显示高出49像素,我不知道我还需要做什么。下面是我添加到
viewDidLoad
方法中的简单代码

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
下面是创建和添加自定义子视图的代码,它在iOS 7上显示得更高

CGRect customControlFrameRect = {{0.0f, 240.0f}, {100.0f, 100.0f}};
self.customControl = [[MyCustomControl alloc] initWithFrame:customControlFrameRect];

self.customControl.autoresizingMask =  UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
[self.view addSubview:self.customControl];
另一个重要的细节(如果有帮助的话)是该视图是从nib文件创建的,但是在我设置了
edgesForExtendedLayout
属性之后,在iOS 7上显示的高于iOS 6的自定义子视图是在
viewDidLoad
中以编程方式创建和添加的唯一子视图。无论我是否设置了
egdesForExtendedLayout
属性,从nib创建的所有其他子视图都不会受到影响

我的两个问题是

  • 为什么即使我将edgesForExtendedLayout属性设置为UIRectEdgeNone,我的自定义子视图在iOS 7上仍显示得更高
  • 为什么其他子视图(从nib加载的子视图)在iOS 7中没有显示得更高
  • 提前感谢您的智慧

    一,。 这是
    edgesForExtendedLayout
    的目的,它被设置为
    UIRectEdgeNone
    向任何方向扩展视图,但是当使用位置为0、0的帧时(就像您使用
    customControl
    时),您的视图现在将从屏幕大小内的原点开始(现在位于状态栏下方!)。您需要调整视图/视图控制器的框架,以表示要在状态栏/导航栏下启动,或使状态栏/导航栏不透明;如果仅用于一个视图,则添加UIDirectedGetop

    将navigationController设置为不透明也将使用状态栏执行此操作:

    self.navigationController.navigationBar.translucent = NO;
    
    2.
    由于默认情况下界面生成器在导航栏下正确设置了框架,因此您当然可以对其进行更改。它使用了
    uidirectedgeall
    和自动调整大小。

    我发现,在某些情况下,
    视图中设置
    edgesForExtendedLayout
    将显示:
    而不是viewDidLoad,这是我想要的结果。这可能无法解决您的问题,但它在一些情况下帮助了我,希望它能帮助其他人。

    这些其他视图是否与导航控制器一起使用?这个自定义视图不是吗?@yurish,父视图包含在导航控制器中,自定义子视图包含在父视图中,如果有帮助的话。其他子视图如何定位在父视图中?它们是否已捕捉到superview的底部?如果在view controller init方法中设置
    edgesForExtendedLayout
    ,会发生什么情况?该视图不包含tableview,但包含集合视图。更改了答案以反映更多问题。这会导致半透明导航条后出现奇怪的闪烁。太好了!这就是我的解决方案!
       if( [self respondsToSelector:@selector(setEdgesForExtendedLayout:)] )
        {
            self.edgesForExtendedLayout=UIRectEdgeNone;
            self.extendedLayoutIncludesOpaqueBars=NO;
            self.automaticallyAdjustsScrollViewInsets=NO;
        }