我使用Xcode6 beta6打开了一个现有的iOS项目,Xcode为Storyboard和Xib文件列出了以下警告:
自动首选最大布局宽度在iOS版本上不可用 在8.0之前
我尝试通过将宽度设置为显式来解决警告,如下所示:
然而,这并没有解决警告。他们怎么能被删除?
答案 0 :(得分:373)
更新3:
如果部署目标设置为7.1,则numberOfLines
设置为除1之外的任何标签的标签也可以触发此警告。这可以通过新的单视图项目完全重现。
重现步骤:
我提交了以下雷达:
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”
答案 1 :(得分:315)
要在大型故事板中查找问题标签,请按照以下步骤操作。
接下来,将您的故事板显示为源文件。
搜索。你应该能够通过查看内容很容易地从这里告诉它是什么标签。
找到标签后,对我有用的解决方案是将“首选宽度”设置为0。
顺便说一下,您可以通过选择项目并查看标识检查器,快速获取界面项的ID。非常方便。
答案 2 :(得分:36)
您可以解决此问题,而无需打开故事板作为来源。 如果numberOfLines!= 1且部署目标是&lt; UILabels,则会触发此警告。 8.0
如何找到它?
答案 3 :(得分:23)
解决方案非常简单
只需为iOS 8及更高版本启用Builds
答案 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开发。从项目的常规设置中检查。
答案 8 :(得分:1)
我遇到了这个问题,并且能够通过添加约束来确定标签的最大值。
当删除多行标签时,没有设置约束来强制父视图内的宽度。这是新的PreferredMaxWidth发挥作用的地方。在iOS 7及更早版本中,您必须自己定义最大宽度。我只是在标签的左侧和右侧添加了一个10px约束。
您还可以添加&lt; =宽度约束,这也可以解决问题。
所以这实际上不是一个错误,你只需要自己定义最大宽度。在设置此宽度值时,其他答案中提及的显式选项也会起作用,但如果您希望根据父宽度更改最大宽度(因为您已明确设置宽度),则必须修改此值。
我的上述解决方案确保无论父视图有多大,都始终保持宽度。
答案 9 :(得分:1)