为什么iOS 13会删除我的布局约束更改?

为什么iOS 13会删除我的布局约束更改?,ios,autolayout,ios13,xcode11,Ios,Autolayout,Ios13,Xcode11,我有一个表视图,它的单元格配置了自动布局约束,可以根据内容处理几个稍微不同的布局。我通过在要激活或停用的约束上设置active属性来进行更改。在我将应用程序放到后台并返回之前,这一切都很正常。当我这样做时,看起来我的更改丢失了,单元格的布局约束返回到它们最初在nib文件中的状态 只有在使用Xcode 11构建的iOS 13上运行时,才会发生这种情况。如果我在iOS 12上运行的版本是Xcode 10.3或Xcode 11,我看不到这个问题。如果我使用Xcode 10.3的版本在iOS 13上运行

我有一个表视图,它的单元格配置了自动布局约束,可以根据内容处理几个稍微不同的布局。我通过在要激活或停用的约束上设置
active
属性来进行更改。在我将应用程序放到后台并返回之前,这一切都很正常。当我这样做时,看起来我的更改丢失了,单元格的布局约束返回到它们最初在nib文件中的状态

只有在使用Xcode 11构建的iOS 13上运行时,才会发生这种情况。如果我在iOS 12上运行的版本是Xcode 10.3或Xcode 11,我看不到这个问题。如果我使用Xcode 10.3的版本在iOS 13上运行,我看不到这个问题

我曾尝试在
-[NSLayoutConstraint setActive:
处放置一个符号断点,但在将应用程序放在后台或将其返回前台时,该断点未被命中

还有谁遇到过这样的问题吗?有什么提示吗?谢谢

编辑:演示此问题的小项目位于


启动应用程序,它会在图像旁边显示一个带有标签的表格视图。将应用程序保留在主屏幕上,然后返回到应用程序,此时标签与图像重叠。

问题在于,在单元格xib中,您取消选中了图像对齐标签约束的已安装复选框。但这正是你希望保持激活状态的约束


(然而,这只是症状。真正的问题是,您的目标是交换约束,但您做得不对。您试图通过从xib文件中的两组约束开始进行交换。不。您从xib文件中的一组约束开始,然后在代码中创建另一组约束。保留对这两组约束的强引用。现在交换em in和out很简单。注意:在交换过程中,始终在添加之前删除,否则会发生冲突。)

我面临同样的问题。我改变了方法,从有两个约束激活/禁用其中一个约束,改为只保留一个约束,并更新常量值以实现我的目标。

我还没有看到这一点,但如果你能把它们放在一起,我会看一看。“在我将应用程序放到后台并返回到它之前,这一切都很正常。当我这样做时,我的更改看起来好像丢失了”可能是因为你的应用程序在后台终止并在你返回时重新启动吗?不,调试器在后台和前台更改之间保持连接。这也是我验证
-[NSLayoutConstraint setActive:
未被调用。那么,让我们看看如何体验这种行为。我添加了一个演示此问题的最小示例程序。这是有意的。
Cell.m
中的代码启用该约束并禁用
|-12-[label]
constraint。我遇到的问题是,这些约束激活更改在离开和返回应用程序时不会持续。尝试我的意思。检查已安装。运行应用程序。一切都会好起来。当我这样做时,我在Interface Builder和控制台日志中收到冲突的约束警告。行为看起来正确,但是,当系统警告我有不可满足的冲突约束时,我不相信它会始终正确运行。当然,它会抱怨冲突约束。它们是冲突的!但是应用程序是好的,因为我们启动时,您要做的第一件事就是删除其中一个约束。您可以在视图调试器中再次检查,但我不同意请确保它工作正常。我相信我已经回答了这个问题:您通过取消选中Installed(已安装)做了一件错误的事情。这不是复选框的目的。当然,真正的问题是这是一个x-y问题。您的目标是交换约束,这很好,但从一开始就在xib中同时使用这两个约束并不是您的做法。您的尝试这样做从一开始就注定要失败。我的问题是,我试图生成两种不同的布局。例如,一种情况在文本一侧有一个按钮,而另一种情况(大动态字体大小)在文本下方有一个按钮。仅更改常量不会产生这种行为。