自动首选最大布局宽度在8.0之前的iOS版本上不可用

mon*_*ono 322 ios autolayout xcode6 ios8

我用Xcode6 beta6打开了一个现有的iOS项目,Xcode为Storyboard和Xib文件列出了以下警告:

自动首选最大布局宽度在8.0之前的iOS版本上不可用

我尝试通过将宽度设置为显式来解决警告,如下所示:

然而,这并未解决警告.他们怎么能被删除?

mem*_*ons 373

更新3:如果部署目标设置为7.1
,则numberOfLines设置为除1之外的任何标签也可以触发此警告.这可以通过新的单视图项目完全重现.

重现步骤:

  1. 创建一个新的单视图,objective-c项目
  2. 将部署目标设置为7.1
  3. 打开项目的故事板
  4. 将标签拖放到提供的视图控制器上
  5. 将该标签的numberOfLines设置为2.

我提交了以下雷达:
rdar:// problem/18700567

更新2:
不幸的是,在Xcode 6的发布版本中再次出现这种情况.请注意,您可以在大多数情况下手动编辑storyboard/xib来解决问题.Per Charles A.在下面的评论中:

值得一提的是,您很容易意外地引入此警告,并且警告本身无助于找到作为罪魁祸首的标签.这在复杂的故事板中是不幸的.您可以将故事板作为源文件打开,并使用正则表达式<label(?!.*preferredMaxLayoutWidth)进行搜索,以查找省略preferredMaxLayoutWidth属性/值的标签.如果在这些行上添加preferredMaxLayoutWidth ="0",则与标记显式和设置值0相同.

更新1:
此错误现已在Xcode 6 GM中修复.

原始答案
这是Xcode6-Beta6和XCode6-Beta7中的一个错误,现在可以安全地忽略.

苹果开发者论坛上的一位苹果工程师对此漏洞说:

首选的最大布局宽度是UILabel上的自动布局属性,允许它自动垂直增长以适合其内容.6.0之前的Xcode版本会在设计时将多行标签的preferredMaxLayoutWidth设置为当前边界大小.如果水平布局发生更改,则需要在运行时手动更新preferredMaxLayoutWidth.

iOS 8增加了对在运行时自动计算preferredMaxLayoutWidth的支持,这使得创建多行标签变得更加容易.此设置不向后兼容iOS 7.为了支持iOS 7和iOS 8,Xcode 6允许您在尺寸检查器中为preferredMaxLayoutWidth选择"自动"或"显式".你应该:

如果以iOS 8为目标,请选择"自动"以获得最佳体验.如果定位<iOS 8,请选择"明确".然后,您可以输入要设置的preferredMaxLayoutWidth的值.在选中此框时,启用"显式"默认为当前边界大小.

如果(1)您正在使用自动布局,则会出现警告,(2)为多行标签设置"自动"[您可以在尺寸检查器中检查标签],以及(3)您的部署目标<iOS 8.

似乎该错误是针对非自动布局文档出现此警告.如果您看到此警告但未使用自动布局,则可以忽略该警告.

或者,您可以使用故事板或相关xib上的文件检查器来解决此问题,并将"Build for for"更改为"Build for iOS 8.0 and Later" Xcode文件检查器

  • 值得一提的是,您很容易意外地引入此警告,并且警告本身无助于找到作为罪魁祸首的标签.这在复杂的故事板中是不幸的.您可以将故事板作为源文件打开,并使用正则表达式"<label(?!.*preferredMaxLayoutWidth)"进行搜索,以查找省略`preferredMaxLayoutWidth`属性/值的标签.如果在这些行上添加`preferredMaxLayoutWidth ="0"`,则与标记显式和设置值"0"相同. (15认同)
  • 是否有任何方式以编程方式配置UILabel以自动调整preferredMaxLayoutWidth,而不实际将其子类化或在layoutSubviews中的某处实现它?如果这是IB可以启用的行为,则表明可以设置属性或魔术值.但API文档或标题中没有任何内容表明这一点. (6认同)
  • @CharlesA.我一直在测试一个空项目,并发现另一个标签属性将触发此警告:如果`numberOfLines`设置为除1之外的任何值,则无论是否设置了"preferredMaxLayoutWidth",都会发生警告. (2认同)
  • @ MichaelG.Emmons奇怪,我无法通过干净的项目和部署目标设置为7.1来重现这一点.一旦我将`preferredMaxLayoutWidth`设置为显式0,无论`numberOfLines`值如何,警告都会消失.但也许今天早上在Xcode更新中修复了这个问题? (2认同)
  • 那么...是将行数设置为1并从代码中更改它的唯一解决方案吗?这似乎不专业 (2认同)

smi*_*Bot 315

要在大型故事板中查找问题标签,请按照以下步骤操作.

  1. 在xCode的Issue Navigator中右键单击错误并选择"Reveal In Log".(注意:@Sam建议在下面,查看xCode的报告导航器.另外@Rivera在评论中注意到"从Xcode 6.1.1开始,点击警告将自动打开并突出显示冲突的标签".我没有测试过这个).

在此输入图像描述

  1. 这将显示故事板文件末尾的代码错误.复制.storyboard之后的值

在此输入图像描述

  1. 接下来,将您的故事板显示为源文件. 在此输入图像描述

  2. 搜索.你应该能够通过查看内容很容易地从这里告诉它是什么标签. 在此输入图像描述

一旦找到标签,对我有用的解决方案是将"首选宽度"设置为0.

在此输入图像描述

顺便说一句,您可以通过选择项目并查看标识检查器,快速获取界面项的ID.非常便利.

在此输入图像描述

  • 这应该是公认的答案!这实际上解决了这个问题.它甚至可以帮助找到故事板中没有正常显示的其他问题.一件事:我发现*Report Navigator*比右键单击"Log in Reveal"要可靠得多 (36认同)
  • 真棒的答案!您可以直接从Storyboard的IB视图中搜索对象ID.只需按Ctrl-f即可.无需将其作为源代码打开,然后必须切换回IB视图以更改首选宽度. (9认同)
  • 为什么将首选宽度设置为零而不是界面构建器中显示的宽度? (2认同)

Tib*_*abo 36

您可以在不打开故事板作为源的情况下解决此问题.如果numberOfLines!= 1且部署目标<8.0,则由UILabels触发此警告

如何找到它?

  1. 转到问题导航器(CMD + 8)并选择最新构建的警告 在此输入图像描述
  2. 找到警告(搜索" 自动首选最大布局 "),然后按右侧的展开按钮
    在此输入图像描述
  3. 找到 UILabel 的对象ID在此输入图像描述
  4. 打开Storyboard并搜索对象的SEARCH(CMD + f).它将选择并突出显示UILabel
  5. 如其他人所建议的那样设置首选宽度= 0"明确"


Ale*_*ngo 23

解决方案很简单

只需为iOS 8及更高版本启用Builds

在此输入图像描述

  • @aryaxt我很抱歉地说你错了.您可以将项目设置中的部署目标设置为iOS 7或更低版​​本,并将IB文档中的Builds更改为iOS 8及更高版本,它将在iOS 7上运行.请验证它并删除downvote.你可以在这里查看https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/DeployingSizeClassesonEarlieriOSVersions.html#//apple_ref/doc/uid/TP40014436-CH13-SW1 (6认同)