Answers:
更新3:如果将部署目标设置为7.1
,则还可以通过将标签numberOfLines
设置为1以外的任何标签来触发此警告。使用新的单视图项目,这是完全可重现的。
重现步骤:
我已提交以下雷达:
rdar:// problem / 18700567
更新2:
不幸的是,这在Xcode 6的发行版中还是一回事。请注意,在大多数情况下,您可以手动编辑情节提要/ 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选择“ Automatic”或“ Explicit”。你应该:
如果将iOS 8作为最佳体验,请选择“自动”。如果定位<iOS 8,则选择“显式”。然后,您可以输入要设置的preferredMaxLayoutWidth的值。选中此框时,默认情况下,启用“显式”为当前边界大小。
如果(1)您正在使用自动版式,(2)多行标签设置为“自动”,则将出现警告(您可以在大小检查器中为标签检查此标签),以及(3)部署目标<iOS 8。
似乎错误是针对非自动布局文档显示此警告。如果看到此警告而不使用自动布局,则可以忽略该警告。
或者,您可以通过使用有问题的故事板或xib上的文件检查器来解决此问题,并将“ Builds for”更改为“ Builds for iOS 8.0 and Later”
<label(?!.*preferredMaxLayoutWidth)
进行搜索以查找省略preferredMaxLayoutWidth
属性/值的标签。如果preferredMaxLayoutWidth="0"
在这些行上添加,则与标记显式和设置value相同0
。
numberOfLines
设置为除1以外的任何值,则无论是否preferredMaxLayoutWidth
设置,都会发生该警告。
preferredMaxLayoutWidth
为显式0,无论numberOfLines
值如何,警告都会消失。但这可能是在今天早上的Xcode更新中解决的吗?
要在大型故事板上找到问题标签,请按照以下步骤操作。
接下来,将情节提要显示为源文件。
搜索。通过查看内容,您应该可以很容易地从这里分辨出什么标签。
找到标签后,对我有用的解决方案是将“首选宽度”设置为0。
顺便说一句,您始终可以通过选择接口项并在标识检查器下方查看,来快速获取接口项的ID。非常便利。
解决方法很简单
只需启用iOS 8和更高版本的构建
现在我的Xcode版本是6.1。但是我也得到了这个警告。这让我很烦恼。一遍又一遍的搜索后,我找到了解决方案。
原因:您必须在情节提要中设置UILabel Lines> 1。
解决方案:在情节提要中将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;
由于我没有50的声誉,Stackoverflow不会让我评论第二好的答案。找到了另一个在情节提要中找到罪魁祸首标签的技巧。
因此,一旦知道标签的ID,就可以在显示视图控制器的单独选项卡中打开情节提要,只需执行命令F和命令V,即可直接转到该标签:)
我遇到了这个问题,并且能够通过添加约束以确定标签的最大值来解决此问题。
在其中放置多行标签时,没有设置约束来强制父视图内部的宽度。这是新的PreferredMaxWidth起作用的地方。在iOS 7和更低版本上,您必须自己定义最大宽度。我只是在标签的左侧和右侧添加了10px约束。
您还可以添加<=宽度约束,这也可以解决该问题。
因此,这实际上不是错误,您只需自己定义最大宽度。在您设置此宽度值时,其他答案中提到的显式选项也将起作用,但是,如果您希望最大宽度根据父宽度(因为您已显式设置宽度)而改变,则必须修改此值。
我上面的解决方案可确保无论父视图有多大,都始终保持宽度。