我在iOS 7和8上工作的应用程序在iOS9上遇到了一些小问题,其中一个是单个视图控制器的高度错误。
以下代码:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self layoutViews];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[self layoutViews];
}
- (void)layoutViews {
NSLog(@"Size-> %@", NSStringFromCGRect(self.view.frame));
}
产生以下错误输出:
2015-11-06 22:42:31.737 app[62442:1136052] Size-> {{0, 0}, {375, 667}}
2015-11-06 22:42:33.318 app[62442:1136052] Size-> {{0, 32}, {667, 343}}
2015-11-06 22:42:34.885 app[62442:1136052] Size-> {{0, 64}, {375, 603}}
2015-11-06 22:45:18.063 app[62442:1136052] Size-> {{0, 32}, {667, 343}}
当我:
似乎VC的初始加载在self.frame.size
下提供了错误的大小,而所有后续轮换都是正确的。 603
的高度是正确的,但您可以看到在两次旋转时,它在667
处仍然不正确。
我认为与导航控制器栏有关的事情可能会破坏它。我在viewDidLoad
方法中的代码很简单:
- (void)viewDidLoad {
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) {
[self setEdgesForExtendedLayout:UIRectEdgeNone];
}
[super viewDidLoad];
}
在iOS 8上运行正常。
更新
通过添加对viewDidAppear
:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self layoutViews];
[activitiesTable flashScrollIndicators];
}
答案 0 :(得分:0)
我不确定您为什么要在setEdgesForExtendedLayout
中添加viewDidLoad
。我试过你的方式
UIRectEdgeNone
:
2015-11-06 19:40:41.881 Test[934:275179] Size-> {{0, 64}, {375, 603}}
我的视图控制器上有导航栏。
UIRectEdgeTop
&& UIRectEdgeAll
:
2015-11-06 19:52:18.086 Test[1113:331687] Size-> {{0, 0}, {375, 667}}
UIRectEdgeLeft
&& UIRectEdgeBottom
&& UIrectEdgeRight
&& UIRectEdgeNone
:
2015-11-06 19:54:43.864 Test[1137:343893] Size-> {{0, 64}, {375, 603}}
如文件中所述:
在iOS 7中,视图控制器使用全屏布局。同时,iOS 7可以更精细地控制视图控制器的视图布局。特别是,全屏布局的概念已经过改进,让视图控制器指定其视图每个边的布局。
不推荐使用wantsFullScreenLayout视图控制器属性 iOS 7.如果您当前指定的wantFullScreenLayout = NO,则视图 控制器可以在意外的屏幕位置显示其内容 当它在iOS 7中运行时。
使用edgesForExtendedLayout指定视图的哪些边应该扩展,而不管条形半透明度。默认情况下,此属性的值为UIRectEdgeAll。
如果您查看案例UIRectEdgeAll
vs UIRectEdgeNone
如果您使用UIRectEdgeAll,视图控制器视图将使用全屏布局:
如果您使用UIRectEdgeNone,视图控制器将不会使用全屏布局,它会将视图向右推向导航栏的底部:
我建议使用UIEdgeRectAll
代替UIEdgeRectNone
,除非你真的想要组织所有子视图的帧,包括你的视图控制器视图!!!!
答案 1 :(得分:0)
您的代码是正确的,并且在首次加载后其工作正常。
第一次加载应用程序出现问题。
Apple Document for Auto layout提供了答案。
您只需要用viewDidAppear:
方法编写代码。
所以将代码从viewDidLoad:
方法编写到
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated]; }