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


322

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

8.0之前的iOS版本不提供自动首选最大布局宽度

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

但这并没有解决警告。如何删除它们?


3
我正在使用XCode 6.1,并将所有标签更新为Preferred Width = Explicit。这为我解决了这个问题。
djburdick

Answers:


373

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

重现步骤:

  1. 创建一个新的单视图,objective-c项目
  2. 将部署目标设置为7.1
  3. 打开项目的故事板
  4. 将标签粘贴到提供的视图控制器上
  5. 将该标签的numberOfLines设置为2。
  6. 编译

我已提交以下雷达:
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” Xcode文件检查器


15
值得一提的是,您很容易意外地引入此警告,而警告本身并不能帮助您找到肇事者的标签。在复杂的故事板中,这是不幸的。您可以将情节提要板作为源文件打开,并使用正则表达式<label(?!.*preferredMaxLayoutWidth)进行搜索以查找省略preferredMaxLayoutWidth属性/值的标签。如果preferredMaxLayoutWidth="0"在这些行上添加,则与标记显式和设置value相同0
Charles A.

6
是否可以通过编程方式配置UILabel以自动调整preferredMaxLayoutWidth,而无需实际对其进行子类化或在layoutSubviews中的某处实现它?如果这是IB可以启用的行为,则表明存在可以设置的属性或魔术值。但是API文档或标头中没有任何内容说明这一点。

2
@CharlesA。我一直在测试一个空项目,发现另一个标签属性将触发此警告:如果numberOfLines设置为除1以外的任何值,则无论是否preferredMaxLayoutWidth设置,都会发生该警告。
回忆

2
@ MichaelG.Emmons奇怪,我无法使用干净的项目和将部署目标设置为7.1来重现此问题。一旦将设置preferredMaxLayoutWidth为显式0,无论numberOfLines值如何,警告都会消失。但这可能是在今天早上的Xcode更新中解决的吗?
Charles A.

2
那么...是将行数设置为1并从代码中更改它的唯一解决方案吗?这似乎并不专业
jomafer 2014年

315

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

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

在此处输入图片说明

  1. 这将在情节提要文件的末尾显示带有代码的错误。复制.storyboard之后的值

在此处输入图片说明

  1. 接下来,将情节提要显示为源文件。 在此处输入图片说明

  2. 搜索。通过查看内容,您应该可以很容易地从这里分辨出什么标签。 在此处输入图片说明

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

在此处输入图片说明

顺便说一句,您始终可以通过选择接口项并在标识检查器下方查看,来快速获取接口项的ID。非常便利。

在此处输入图片说明


36
这应该是公认的答案!这实际上解决了问题。它甚至有助于在情节提要中查找其他无法正常显示的问题。一件事:我发现报表导航器比右键单击“日志显示”要可靠得多
Sam Spencer 2015年

1
爱这个答案,很简单并修复了警告。非常感谢!
伊桑·帕克

1
谢谢你soooo muchhhhhh :)
SR Nayak

2
为什么将首选宽度设置为零,而不是设置为界面生成器中显示的宽度?
Biclops 2015年

9
很棒的答案!您可以直接从情节提要的IB视图中搜索对象ID。只需执行Ctrl-f。无需将其作为源代码打开,然后必须切换回IB视图以更改首选宽度。
AndroidDev 2015年

36

您可以在不打开情节提要作为源的情况下解决此问题。如果numberOfLines!= 1且部署目标<8.0,则由UILabels触发此警告

如何找到它?

  1. 转到问题导航器(CMD + 8)并选择带有警告的最新版本 在此处输入图片说明
  2. 找到警告(搜索“ Automatic Preferred Max Layout ”),然后按右侧的展开按钮
    在此处输入图片说明
  3. 查找 UILabel 的对象ID在此处输入图片说明
  4. 打开情节提要和对象的搜索(CMD + f)。它将选择并突出显示UILabel
  5. 设置其他建议的“首选宽度” = 0“显式”

23

解决方法很简单

只需启用iOS 8和更高版本的构建

在此处输入图片说明


非常简单且具有破坏性。只有85%的iOS用户在iOS8 + developer.apple.com/support/app-store上
aryaxt

6
@aryaxt我很抱歉地说你错了。您可以在项目设置中将部署目标设置为iOS 7或更低版​​本,并将IB文档中的Builds更改为iOS 8或更高版本,它将在iOS 7上运行。请验证它并删除掉票。您可以检查在这里developer.apple.com/library/ios/recipes/...
亚历杭德罗·Luengo

1
一如既往,最好的答案不是被接受的……:)干杯!
HepaKKes

iOS9.3及更高版本的更新:iOS7设备不再使用上述设置渲染情节提要。这曾经在9.3更新之前起作用。看起来苹果公司在他们的预发布自动化过程中改变了一些东西。
pechar '16

4

现在我的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;

3
“如果确实需要显示多于1行的单词,则应在代码中进行。” 这是巨魔吧?
webstersx 2015年

@webstersx我认为他很认真
Jasper

4

总而言之,对我来说,按照上面的两个说明将numberOfLines = 0更改为1或更大的任何实例,并手动向Storyboard源代码内的标签的每个实例添加preferredMaxLayoutWidth =“ 0”,修复了我的所有警告。


杜德,你是个向导!甚至可以按预期与UIScrollerView一起使用。最好的解决方案至今,因为我可以离开我的笔尖的部署的目标上iOS7.0
薯芋

3

由于我没有50的声誉,Stackoverflow不会让我评论第二好的答案。找到了另一个在情节提要中找到罪魁祸首标签的技巧。

因此,一旦知道标签的ID,就可以在显示视图控制器的单独选项卡中打开情节提要,只需执行命令F和命令V,即可直接转到该标签:)


您的意思是在项目中搜索标签ID。
Borzh 2015年


1

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

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

您还可以添加<=宽度约束,这也可以解决该问题。

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

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


1

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.