屏幕旋转前,自动布局约束不正确?

时间:2014-05-21 17:42:43

标签: ios cocoa-touch autolayout interface-builder

我有一个简单的布局,我有一个UINavigationViewController和一个显示在其中的常规视图控制器。然后我有一个固定大小的图像,以及一些应该填充剩余空间的文本。见下文:

simple view layout with a navigation controller, an image and some text

前景中图像的顶部被约束到顶部布局指南,它在Xcode中工作正常(不显示任何警告或任何内容),但在运行时似乎被忽略:

ios simulator showing incorrect layout

图像的顶部固定在屏幕顶部而不是导航栏的底部。我知道这不一定是不正确的(表格视图向上滚动到导航栏下方),但这非常烦人,因为这里没有滚动。

但等等,还有更多。如果我旋转屏幕,它会自行修复!

ios simulator showing fixed layout

我尝试过在不同的地方添加layoutIfNeeded的电话,但无济于事。

我做错了什么?

附注:

  • 我在设备上测试了它,它的行为相同,所以我只截了模拟器
  • 忽略背景图片视图,它不相关
  • 我不知道为什么文本显示在Xcode中切断,但它似乎在运行时工作正常所以我不在乎

根据下面的dasdom的评论,我尝试在代码中添加此约束,没有明显的变化。我不是百分之百确定我做对了,但是:

-(void)viewDidLayoutSubviews {
    NSMutableDictionary * views = [NSMutableDictionary new];
    views[@"v"] = self.imageView;
    views[@"topLayoutGuide"] = self.topLayoutGuide;
    NSMutableArray * constraints = [NSMutableArray new];

    [constraints addObjectsFromArray:[NSLayoutConstraint
                                 constraintsWithVisualFormat:@"V:[topLayoutGuide][v]"
                                 options:0
                                 metrics:nil
                                 views:views]
    ];
    [self.view addConstraints:constraints];
    [self.view layoutSubviews];
}

一些调试输出:

如果我在viewWillAppear期间打印出导航控制器,我明白了:

2014-05-21 14:45:51.961 iBeaconMap[914:60b] self.navigationController.navigationBar: <UINavigationBar: 0x8cbded0; frame = (0 20; 320 44); opaque = NO; autoresize = W; userInteractionEnabled = NO; gestureRecognizers = <NSArray: 0x8c72440>; layer = <CALayer: 0x8cbe010>>

如果我设置一个计时器以定期打印topLayoutGuide的值,它会在我第一次旋转时显示“20”,此时它会根据方向显示“52”或“64” (如预期的那样)。

也许我需要弄清楚旋转对导航控制器做了什么,并模拟....... 抓住吸管

1 个答案:

答案 0 :(得分:-1)

Navigation controller top layout guide not honored with custom transition中实施解决方案后,问题已解决。

问题实际上是由我甚至没想到的自定义转换引起的(因为这就是为什么会出现问题?)。在自定义转换面前,topLayoutGuide属性似乎不可靠。很高兴知道,我猜。