在屏幕旋转之前,自动布局约束不正确? [复制]

Posted

技术标签:

【中文标题】在屏幕旋转之前,自动布局约束不正确? [复制]【英文标题】:Auto Layout constraints incorrect until screen rotates? [duplicate] 【发布时间】:2014-05-21 17:42:43 【问题描述】:

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

前景中图像的顶部受限于顶部布局指南,这在 Xcode 中运行良好(不显示任何警告或任何内容),但在运行时似乎被忽略了:

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

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

我尝试了诸如在不同的地方添加对layoutIfNeeded 的呼叫之类的方法,但无济于事。

我做错了什么?

旁注:

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

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

-(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”(如预期)。

也许我需要弄清楚旋转对导航控制器做了什么,并模拟它....... 正在抓住稻草

【问题讨论】:

类似的东西让我相信 Interface Builder 还不足以做自动布局。尝试将约束添加到视图控制器中viewWillAppear: 的顶部布局指南中。 我刚刚尝试过,但它似乎没有改变任何东西。我已经用我使用的代码更新了这个问题。我在viewDidLayoutSubviews 中实现了它,因为这似乎是苹果推荐的。不过,没有骰子。 导航栏已经存在了吗?尝试在调试器中打印出顶部布局指南。 我不确定它是否“存在”,但self.topLayoutGuide.length 打印出20(大概是状态栏)。如果我发疯并要求self.navigationController.topLayoutGuide.length,它会返回0。这可能解释了我的本地 topLayoutGuide 不正确,尽管它没有解释为什么...... 帮我一个忙,并将其添加到 viewWillAppear 中进行测试。并添加以下日志:NSLog(@"self.navigationController.navigationBar: %@", self.navigationController.navigationBar); 【参考方案1】:

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

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

【讨论】:

很高兴知道你把它修好了! 您应该接受正确的答案以帮助有相同问题的人。 它不会让我几天。不过,我会的!

以上是关于在屏幕旋转之前,自动布局约束不正确? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

自动布局和设备旋转中到顶部的比例距离

任何自动布局大师能够启发我约束和旋转?

设备旋转时是不是有动画自动布局(约束)?

自动布局约束未正确放置容器视图

UITableViewHeaderFooterView 不支持笔尖中的自动布局约束

如何正确设置 4s 的自动布局约束?