我有一个在iOS 5时代写过的视图控制器,我正在尝试将其转换为iOS 7.阅读iOS 7过渡指南并在SO上进行探索后,我发现我需要设置新的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文件创建的,但iOS 7上比iOS 6更高的自定义子视图是在{{1}中以编程方式创建和添加的唯一子视图在我设置viewDidLoad
属性之后。无论是否设置edgesForExtendedLayout
属性,从笔尖创建的所有其他子视图都不会受到影响。
我的两个问题是......
提前感谢您的智慧!
答案 0 :(得分:8)
edgesForExtendedLayout
的目的是将UIRectEdgeNone
设置为而不是以任何方向扩展视图,但您的视图现在将在屏幕尺寸内的原点开始(当时位于statusBar下面!)当使用位置为0,0的帧时(就像使用customControl
一样)。您需要调整视图/ viewController的框架以表示您要在statusBar / navigationBar下启动或使状态/ nagivationBar不透明;或者如果仅用于一个视图,则添加UIRectEdgeTop。
将navigationController设置为opaque也将使用statusBar:
self.navigationController.navigationBar.translucent = NO;
由于界面构建器默认情况下会在navigationBar下正确设置框架,因此您当然可以更改它。它使用UIRectEdgeAll
和自动调整。
答案 1 :(得分:4)
我发现 在某些情况下 ,在edgesForExtendedLayout
而不是viewDidLoad设置viewWillAppear:
会给我结果我是寻找。这可能无法解决你的问题,但它在一些情况下帮助了我,希望它能帮助其他人。
答案 2 :(得分:0)
if( [self respondsToSelector:@selector(setEdgesForExtendedLayout:)] )
{
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;
}