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

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

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

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

.

然而,这并没有消除警告。如何去除?

101106 次浏览

我通过选择W / H选项中的原始布局来让它工作。故事板正在正常工作,错误已经消失。

还要确保你开发的是iOS 8.0。从项目的一般设置中检查。

这是你应该按的地方

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

复制步骤:

  1. 创建一个新的单视图objective-c项目
  2. 将部署目标设置为7.1
  3. 打开项目的故事板
  4. 将标签放到所提供的视图控制器上
  5. 将该标签的numberolines设置为2。
  6. 编译
我已经提交了以下雷达:
rdar: / /问题/ 18700567 < / p > < p > 更新2: < br > 不幸的是,在Xcode 6的发行版中又出现了这种情况。请注意,在大多数情况下,您可以手动编辑故事板/xib来修复这个问题。

值得一提的是,你很容易不小心 引入这个警告,警告本身并不能帮助寻找 标签才是罪魁祸首。这在一个综合体中是不幸的 故事板。您可以将故事板作为源文件打开并进行搜索 使用正则表达式<label(?!.*preferredMaxLayoutWidth)来查找标签 省略preferredmaxlayoutidth属性/值。如果你加上 preferredmaxlayoutidth ="0"在这样的行,它是相同的标记 显式和设置值0
< p > 更新1: < br > 这个错误现在已经在Xcode 6 GM中修复 < p > 原来的答案 < br > 这是Xcode6-Beta6和XCode6-Beta7中的一个bug,现在可以安全地忽略

一位苹果工程师在苹果开发者论坛上用来描述这个bug:

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

iOS 8增加了自动计算的支持 preferredmaxlayoutidth在运行时,这使得创建多行 标签就更简单了。此设置不向后兼容iOS 7. 为了同时支持iOS 7和iOS 8, Xcode 6允许你在大小上选择“自动”或“显式”的preferredmaxlayoutidth 检查员。你应该:< / p > 如果目标是iOS 8,选择“自动”以获得最佳体验。选择 “明确”如果目标<iOS 8。然后您可以输入的值 preferredmaxlayoutidth你想设置。启用“显式” 默认为您选中复选框时的当前边界大小

如果(1)你正在使用自动布局,(2)警告会出现 为多行标签设置了“自动”[您可以在 (3)您的部署目标<iOS 8 . < / p > 这个错误似乎是这个警告出现在非自动布局 文档。如果你看到这个警告,没有使用自动布局

.使用实例
或者,你可以通过使用故事板或xib上的文件检查器来解决这个问题,并将“用于”更改为“用于iOS 8.0及以后版本的构建” Xcode file inspector

现在我的Xcode版本是6.1。但我也收到了警告。这让我很恼火。经过一遍又一遍的搜索。我找到了解决办法。

原因:你必须在你的故事板中设置你的UILabel Lines > 1。

解决方案:在Storyboard中将UILabel Lines属性设置为1。重启Xcode。这对我有用,希望它能帮助更多的人。

如果你确实需要显示你的单词超过一行。你应该在代码里写。

//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或更大的任何实例,并手动将preferredmaxlayoutidth ="0"添加到故事板源代码中的每个标签实例中,可以修复我的所有警告。

要在大型故事板中找到问题标签,请遵循以下步骤。

  1. 在xCode的Issue Navigator中右键单击错误并选择“Reveal In Log”。(注:@Sam建议在下面,看看xCode的报告导航器。此外,@Rivera在评论中指出,“从Xcode 6.1.1开始,点击警告将自动打开并突出显示冲突标签”。我还没有对此进行测试)。

enter image description here

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

enter image description here

    接下来,显示你的故事板作为源文件。 enter image description here

    <李> < p >搜索。通过查看内容,您应该能够很容易地从这里判断出它是什么标签。 enter image description here

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

enter image description here

顺便说一句,你总是可以通过选择项目并在标识检查器下查看来快速获得接口项目的id。非常方便。

enter image description here

因为我没有50的声誉,Stackoverflow不会让我评论第二好的答案。发现了在Storyboard中寻找罪犯标签的另一个技巧。

因此,一旦你知道了标签的id,在一个单独的选项卡中打开你的故事板,显示视图控制器,只需执行F命令和V命令,就会直接带你到那个标签:)

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

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

你也可以添加一个<= width约束来解决这个问题。

所以这实际上不是一个bug,你只需要自己定义最大宽度。在其他答案中提到的显式选项也可以工作,因为你正在设置这个宽度值,但是如果你想要根据父宽度改变最大宽度,你必须修改这个值(因为你已经显式地设置了宽度)。

我上面的解决方案确保了无论父视图有多大,宽度总是保持不变。

你可以修复这个问题不需要将故事板作为源打开。 如果numberolines !=1并且部署目标是<8.0 < / p >

如何找到它?

  1. 转到Issue Navigator (CMD+8)和选择带有警告的最新构建 enter image description here
  2. 定位警告(搜索“自动首选最大布局”)并按下右侧的展开按钮
    enter image description here
  3. UILabel的
  4. 查找对象ID enter image description here
  5. 打开该对象的故事板和搜索 (CMD+f)。它将选择并高亮显示 UILabel
  6. 设置首选宽度= 0 "Explicit"作为其他人建议

解决方法很简单

只需要启用iOS 8及更高版本的构建即可

enter image description here

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

File inspector in the Xib after changing the iOS Deployment target .

因此,您应该为每个Xib手动更改它  after ther the manual change . < / p >

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