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

时间:2014-08-20 06:44:22

标签: ios autolayout ios8 xcode6

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

  

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

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

然而,这并没有解决警告。他们怎么能被删除?

10 个答案:

答案 0 :(得分:373)

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

重现步骤:

  1. 创建一个新的单视图,objective-c项目
  2. 将部署目标设置为7.1
  3. 打开项目的故事板
  4. 将标签拖放到提供的视图控制器上
  5. 将该标签的numberOfLines设置为2。
  6. 编译
  7. 我提交了以下雷达:
    rdar://问题/ 18700567

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

      

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

    更新1:
    这个错误现在已在Xcode 6 GM中修复。

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

    Apple开发者论坛中的Apple工程师this说了一下这个错误:

      

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

         

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

         

    如果定位iOS 8以获得最佳体验,请选择“自动”。挑   “明确”,如果定位&lt; iOS 8.然后您可以输入值   您想要设置的preferredMaxLayoutWidth。启用“明确”   默认为选中此框时的当前边界大小。

         

    如果(1)您正在使用自动布局,则会出现警告,(2)   为多行标签设置“自动”[您可以在中查看   标签的大小检查器],以及(3)您的部署目标&lt; iOS 8。

         

    似乎错误是此警告显示为非自动布局   文档。如果您看到此警告但未使用自动布局   你可以忽略警告。

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

答案 1 :(得分:315)

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

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

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

      enter image description here

      1. 接下来,将您的故事板显示为源文件。 enter image description here

      2. 搜索。你应该能够通过查看内容很容易地从这里告诉它是什么标签。 enter image description here

      3. 找到标签后,对我有用的解决方案是将“首选宽度”设置为0。

        enter image description here

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

        enter image description here

答案 2 :(得分:36)

您可以解决此问题,而无需打开故事板作为来源。 如果numberOfLines!= 1且部署目标是&lt; UILabels,则会触发此警告。 8.0

如何找到它?

  1. 转到问题导航器(CMD + 8)并选择使用警告构建的最新版本 enter image description here
  2. 找到警告(搜索“自动首选最大布局”)并按右侧的展开按钮
    enter image description here
  3. 查找UILabel的对象ID enter image description here
  4. 打开故事板并为对象 SEARCH (CMD + f)。它将 SELECT AND HIGHLIGHT UILabel
  5. 设置首选宽度= 0“明确”与其他人建议

答案 3 :(得分:23)

解决方案非常简单

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

enter image description here

答案 4 :(得分:4)

现在我的Xcode版本是6.1。但我也得到了这个警告。它让我很烦恼。经过一次又一次的搜索。我找到了解决方案。

原因:您必须设置UILabel线&gt;在你的故事板中1。

解决方案:在Storyboard中将UILabel Lines属性设置为1。重启你的Xcode。它适用于我,希望它可以帮助更多的人。

如果你真的需要显示超过1行的单词。你应该在代码中做到这一点。

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;

答案 5 :(得分:4)

总结一下,按照上面的两条说明,将numberOfLines = 0更改为1或更大的任何实例,并手动添加preferredMaxLayoutWidth =&#34; 0&#34;对故事板源中的每个标签实例修复了我的所有警告。

答案 6 :(得分:3)

由于我没有50点声望Stackoverflow不会让我评论第二个最好的答案。找到另一个在故事板中找到罪魁祸首标签的技巧。

因此,一旦您知道标签的ID,就可以在单独的选项卡中打开您的故事板,并显示视图控制器,只需执行命令F和命令V,然后将直接转到该标签:)

答案 7 :(得分:2)

我通过选择W / H选择中的原始布局来实现它。故事板按预期工作,错误消失。

还要确保您正在为iOS 8.0开发。从项目的常规设置中检查。

This is where you should press.

答案 8 :(得分:1)

我遇到了这个问题,并且能够通过添加约束来确定标签的最大值。

当删除多行标签时,没有设置约束来强制父视图内的宽度。这是新的PreferredMaxWidth发挥作用的地方。在iOS 7及更早版本中,您必须自己定义最大宽度。我只是在标签的左侧和右侧添加了一个10px约束。

您还可以添加&lt; =宽度约束,这也可以解决问题。

所以这实际上不是一个错误,你只需要自己定义最大宽度。在设置此宽度值时,其他答案中提及的显式选项也会起作用,但如果您希望根据父宽度更改最大宽度(因为您已明确设置宽度),则必须修改此值。

我的上述解决方案确保无论父视图有多大,都始终保持宽度。

答案 9 :(得分:1)

出于某种原因,即使将iOS部署目标更改为8.0或更高版本,Xib文件也不会采用该更改并保留在文件检查器中的先前设置

File inspector in the Xib after changing the iOS Deployment target

因此,您应该为每个Xib手动更改它 Afther the manual change

完成后,警告将消失: - )