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

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

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

我尝试通过设置宽度如下所示来解决警告:

然而这并没有解决警告。 他们如何被删除?

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

重现步骤:

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

我已经提交了以下雷达:
rdar://问题/ 18700567

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

值得一提的是,你可以很容易地意外地引入这个警告,而警告本身并不能帮助find罪魁祸首的标签。 这在一个复杂的故事板中是不幸的。 您可以将故事板作为源文件打开,并使用正则expression式<label(?!.*preferredMaxLayoutWidth)以查找省略preferredMaxLayoutWidth属性/值的标签。 如果在这些行中添加preferredMaxLayoutWidth =“0”,则与标记显式和设置值0相同。

更新1:
这个bug现在已经在Xcode 6 GM中修复了。

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

苹果开发者论坛的一名苹果工程师对此有这样的评论:

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

iOS 8添加了在运行时自动计算preferredMaxLayoutWidth的支持,这使得创build多行标签变得更加容易。 此设置不能与iOS 7向后兼容。为了同时支持iOS 7和iOS 8,Xcode 6允许您为尺寸检查器中的preferredMaxLayoutWidthselect“自动”或“显式”。 你应该:

select“自动”,如果针对iOS 8的最佳体验。 如果定位到<iOS 8,请select“显式”。然后可以input您希望设置的preferredMaxLayoutWidth的值。 启用“显式”默认为您选中框时的当前边界大小。

如果(1)您正在使用自动布局,(2)为多行标签设置了“自动”(您可以在尺寸检查器中检查标签),以及(3)您的部署目标<iOS 8。

看来错误是这个警告出现在非自动布局的文件中。 如果您看到此警告并且未使用自动布局,则可以忽略该警告。

或者,您可以通过使用故事板或xib中的文件检查器解决问题,并将“构build”更改为“构buildiOS 8.0及更高版本” Xcode文件检查器

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

  1. 在xCode的Issue Navigator中,右键单击错误并select“显示在日志中”。 (注:@Sambuild议在xCode的报告导航器中查看@Rivera在注释中注意到“从Xcode 6.1.1开始,点击警告会自动打开并突出显示相冲突的标签”。 )。

在这里输入图像描述

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

在这里输入图像描述

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

  2. search。 通过查看内容,您应该能够很轻松地从这里知道它的标签。 在这里输入图像描述

一旦你find了标签,我的解决scheme是将“首选宽度”设置为0。

在这里输入图像描述

顺便说一句,你总是可以快速得到一个接口项目的ID通过select项目,并在鉴定检查员下查找。 非常方便。

在这里输入图像描述

您可以修复此问题, 而无需打开故事板作为源 。 如果numberOfLines!= 1且部署目标<8.0,则此警告由UILabels触发

如何find它?

  1. 转到问题导航器 (CMD + 8)和select最新的警告 在这里输入图像描述
  2. find警告(search“ 自动首选最大布局 ”),然后按下右侧的展开button
    在这里输入图像描述
  3. find UILabel 的对象ID 在这里输入图像描述
  4. 打开对象的Storyboard和SEARCH (CMD + f)。 它会select和突出的UILabel
  5. 像其他人所build议的那样设置Preferred Width = 0“Explicit”

解决scheme很简单

只需启用构buildiOS 8和更高版本

在这里输入图像描述

现在我的Xcode版本是6.1。 但是我也得到了这个警告。 这让我很烦恼 经过一遍又一遍的search。我find了解决办法。

原因:您必须在Storyboard中设置UILabel Lines> 1。

解决scheme:在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; 

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

由于我没有50的名誉Stackoverflow不会让我评论第二个最好的答案。 find了另一个在故事板中find罪魁祸首的技巧。

所以一旦你知道标签的ID,打开你的故事板在一个单独的选项卡与视图控制器显示,只是做命令F和命令V,并会带你直接到该标签:)

我通过select我在W / Hselect中的原始布局来得到它的工作。 故事板正在按预期工作,错误消失了。

还要确定你正在为iOS 8.0开发。 检查项目的一般设置。

这是你应该按的地方。

我有这个问题,并能够解决它通过添加约束来确定标签的最大值。

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

你也可以添加一个<=宽度约束,也解决了这个问题。

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

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

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

更改iOS部署目标后,在Xib中的文件检查器

因此,您应该为每个Xib手动更改它 手动更改

一旦完成,警告将消失:-)