在8.0之前的iOS版本中布局相对于版面边距的属性

什么会导致下面的警告(和iOS 7的后续alignment问题)?

属性不可用:在8.0版本以前的iOS版本中布局相对于版面边距的属性

没有发布的答案为我解决了这个问题。 但是,原因如下: Xcode 6默认情况下会根据相对边界创build约束。 这些只适用于iOS 8.0及更高版本。 当您的部署目标设置为iOS 7.0或更低版本时,会出现这些警告。

我修正警告的方式:

  • 点击Xcode中的警告
  • 属性检查器将打开约束
  • search有空白的项目(见截图)
  • closures相对于保证金选项

属性检查器

禁用“首选保证金相对”

在这里输入图像说明

取消选中“首选相对保证金”checkbox可以防止您进入警告状态。

如果你和我一样,并且在意识到这个问题之前你用一个约束来构build一个完整的应用程序,那么事情会变得更加困难,因为Xcode不会轻易地告诉你哪些约束是一个问题。

为了避免重build所有的约束条件,我使用了一个实际的.storyboard文件,并寻找这样的约束:

<constraint firstItem="vId-..." firstAttribute="top" secondItem="In7-..." secondAttribute="topMargin" id="C0H-..."/> 

注意“topMargin”。 以“Margin”结尾的属性会导致警告。 我通过这种方式来查看文件中的约束条件,然后删除并在IB中重新创build它们。 之后,这个警告消失了。

我怀疑这也应该解决iOS 7和iOS 8约束处理之间的一些不一致之处,尽pipe在处理所有的Xcode警告之后,我仍然遇到一些行为上的差异。

我目前的情况与我在Xcode 6中创build针对iOS7和8的应用程序的情况相同。出现此警告是因为相对于边距的约束在iOS7中不可用,但是它们是在Xcode 6中默认创build的。

您可以绝对回头编辑约束条件,不要使用这个问题的其他答案所build议的“相对于保证金”function。

创build新约束时,在select要创build哪种约束时,按住Option键。 这使我能够创build一个不基于边距的约束,所以我不必在之后回头修复。

Xcode 6默认创build基于相对边界的约束。

所以,如果你想强制删除所有的基准属性,并且不想在Interface Buidler中search所有坏的约束,为了支持iOS 7 ,我可以推荐这种方式

要find并删除约束中的所有“基线”虚拟string,您可以这样做:

  1. closuresXcode
  2. 在您最喜爱的文本编辑器中打开您的stroyboard文件,它支持正则expression式。
  3. 查找和从故事板文件中删除所有string的模式: .*"baseline".*\n
  4. 现在保存文件,并在Xcode中打开它
  5. 修复所有出现的错位:find所有警告,然后按“更新所有视图的约束”来保存所有视图的原始位置。
  6. 利润!

UPD:我发现“基准”约束也会导致崩溃,但Xcode不显示任何有关这些约束的警告!

要解决它 – 从模式文件中删除所有string: .*"baseline".*\n

我采取了非程序员的方法。

我知道哪个视图控制器导致了8.0的保证金信息。 所以,我去了我的约束列表。 我有33个。我已经删除了每个导致8.0保证金消息。 我下降到20(所以11是问题)。

select32超过33删除,看看结果。 select31超过33删除等…自然,当消息仍然存在…删除有问题的一个。

所以花了我5分钟来解决错误信息。

其他约束信息确实出现,但这不是什么大不了的事情。

好吧,重做并逐步解决约束消息,但是这次请检查您添加的所有约束都不会激起8.0边缘消息的重现。 如果是这样,请在添加约束时撤销并采取其他策略。 总有其他的方式来添加一个工作的约束。

这不是由Xcode提出的,但它将完成这项工作。

最后, 你完成了

如果您有多个视图控制器,并且不知道是否有一个视图控制器导致了8.0页边距消息,请尝试隔离每个视图控制器。 可能会在一个单独的testing项目中复制并粘贴或删除除了一个之外的所有其他视图并查看结果。

如果出现问题,使用文件菜单中的“创build快照”可以帮助您。

压制警告:我经历了所有的IB约束,并删除了所有说“第一个基准…”。 这使得所有这些警告消失。 但是,如果“添加缺less的约束”或“重置为build议的约束”,IB将重新引入警告。

可能的原因:从一个新鲜的Xcode 6.1项目中,我使用“重置为build议的约束”来复制/粘贴Storyboard中的ViewControllers(lazily)。 然后将项目目标从8.0改为7.1。 这导致警告popup。 我注意到警告只出现在我的某些ViewController上,我相信这些是我在Storyboard中复制/粘贴的。

build议:如果瞄准7.1,在使用IB之前先设置它。 不要在Storyboard中复制/粘贴视图控制器。 在IB内部工作时要警惕“新警告”,希望能够确认造成这种烦恼的原因。