UIViewController初始加载时的错误高度

时间:2015-11-06 20:47:45

标签: ios objective-c iphone uiviewcontroller ios9

我在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}}

当我:

  1. 以纵向打开VC
  2. 旋转到横向
  3. 旋转回肖像
  4. 旋转回横向
  5. 似乎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];
    }
    

2 个答案:

答案 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,视图控制器视图将使用全屏布局: enter image description here

如果您使用UIRectEdgeNone,视图控制器将不会使用全屏布局,它会将视图向右推向导航栏的底部:

enter image description here

我建议使用UIEdgeRectAll代替UIEdgeRectNone,除非你真的想要组织所有子视图的帧,包括你的视图控制器视图!!!!

答案 1 :(得分:0)

您的代码是正确的,并且在首次加载后其工作正常。

第一次加载应用程序出现问题。

Apple Document for Auto layout提供了答案。

您只需要用viewDidAppear:方法编写代码。

所以将代码从viewDidLoad:方法编写到

-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated]; }