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

Posted

技术标签:

【中文标题】自动首选最大布局宽度在 8.0 之前的 iOS 版本中不可用【英文标题】:Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0 【发布时间】:2014-10-13 10:23:19 【问题描述】:

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

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

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

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

【问题讨论】:

我正在使用 XCode 6.1 并将我的所有标签更新为 Preferred Width = Explicit。这为我解决了这个问题。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

解决方法很简单

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

【讨论】:

相当简单且具有破坏性。只有 85% 的 iOS 用户在使用 iOS8+ developer.apple.com/support/app-store @aryaxt 很抱歉,你错了。您可以在项目设置中将部署目标设置为 iOS 7 或更低版本,并将 IB 文档中的 Builds for 更改为 iOS 8 及更高版本,它将在 iOS 7 上运行。请验证它并删除反对票。你可以在这里查看developer.apple.com/library/ios/recipes/… 一如既往,最好的答案不是被接受的答案... :) 干杯! iOS9.3 及更高版本的更新:iOS7 设备不再使用上述设置呈现情节提要。这曾经在 9.3 更新之前有效。看起来 Apple 在他们的预发布自动化流程中改变了一些东西。【参考方案3】:

您可以解决此问题无需将情节提要作为源打开。 如果 numberOfLines !=1 且部署目标为 ,则此警告由 UILabels 触发

如何找到它?

    转到问题导航器 (CMD+8) 并选择带有警告的最新构建 找到警告(搜索“Automatic Preferred Max Layout”)并按下右侧的展开按钮 查找 UILabel 的对象 ID 打开情节提要和对象的搜索 (CMD+f)。它将选择并突出显示 UILabel 按照其他人的建议设置首选宽度 = 0“显式”

【讨论】:

【参考方案4】:

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

    在 xCode 的问题导航器中,右键单击错误并选择“Reveal In Log”。 (注意:@Sam 建议在下面查看 xCode 的 report navigator。此外,@Rivera 在 cmets 中指出“从 Xcode 6.1.1 开始,单击警告将自动打开并突出显示冲突的标签” .我没有测试过这个)。

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

    接下来,将您的故事板显示为源文件。

    搜索。通过查看内容,您应该能够很容易地从这里分辨出它是什么标签。

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

顺便说一句,您总是可以通过选择项目并在识别检查器下查看来快速获取界面项目的 ID。非常方便。

【讨论】:

这应该是公认的答案!这实际上解决了问题。它甚至有助于在 Storyboard 中找到其他未正常显示的问题。一件事:我发现Report Navigator比右键单击“Reveal in Log”可靠得多 喜欢这个答案,非常简单并修复了警告。非常感谢! 非常感谢你hhhhh :) 为什么将首选宽度设置为零而不是界面生成器中显示的宽度? 很棒的答案!您可以直接从 Storyboard 的 IB 视图中搜索对象 ID。只需执行 Ctrl-f。无需将其作为源代码打开,然后必须切换回 IB 视图来更改首选宽度。【参考方案5】:

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

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

您还可以添加一个

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

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

【讨论】:

【参考方案6】:

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

因此,一旦您知道标签的 id,请在显示视图控制器的单独选项卡中打开故事板,然后执行命令 F 和命令 V,然后将直接带您到该标签:)

【讨论】:

你的意思是在项目中搜索标签ID。【参考方案7】:

总而言之,对我来说,按照上面的两个说明将 numberOfLines = 0 的任何实例更改为 1 或更大,并手动将 preferredMaxLayoutWidth="0" 添加到情节提要源中的每个标签实例修复了我的所有警告。

【讨论】:

老兄,你是个巫师!甚至可以按预期使用 UIScrollerView。迄今为止最好的解决方案,因为我可以将 Nib 的部署目标留在 iOS7.0 上【参考方案8】:

现在我的 Xcode 版本是 6.1。但我也收到了这个警告。这让我很恼火。经过反复搜索,我找到了解决方案。

原因:您必须在 Storyboard 中设置 UILabel Lines > 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;

【讨论】:

"如果您确实需要显示超过 1 行的单词。您应该在代码中执行此操作。"这是一个巨魔,对吧? @webstersx 我认为他是认真的【参考方案9】:

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

复制步骤:

    创建一个新的单视图、objective-c 项目 将部署目标设置为 7.1 打开项目的故事板 将标签拖放到提供的视图控制器上 将该标签的 numberOfLines 设置为 2。 编译

我已提交以下雷达: rdar://problem/18700567

更新 2: 不幸的是,这在 Xcode 6 的发布版本中再次出现。请注意,在大多数情况下,您可以手动编辑故事板/xib 来解决问题。根据以下 cmets 中的 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 为目标,请选择“自动”以获得最佳体验。挑选 如果目标为

如果 (1) 您使用自动布局,(2) 为多行标签设置了“自动”[您可以在 标签的大小检查器],以及 (3) 您的部署目标

似乎这个错误是针对非自动布局出现的 文件。如果您看到此警告并且未使用自动布局 您可以忽略警告。

或者,您可以通过使用情节提要或 xib 上的文件检查器来解决此问题,并将“Builds for”更改为“Builds for iOS 8.0 and later”

【讨论】:

值得一提的是,您很容易不小心引入此警告,而警告本身无助于找到罪魁祸首。这在复杂的故事板中是不幸的。您可以将故事板作为源文件打开并使用正则表达式 <label(?!.*preferredMaxLayoutWidth) 搜索以查找省略 preferredMaxLayoutWidth 属性/值的标签。如果在这些行中添加preferredMaxLayoutWidth="0",则与标记为显式并设置值0 相同。 是否有任何方式以编程方式配置 UILabel 以自动调整 preferredMaxLayoutWidth,而无需实际继承它或在 layoutSubviews 中的某处实现它?如果这是 IB 可以启用的行为,则表明存在可以设置的属性或魔法值。但 API 文档或标头中没有任何说明。 @CharlesA。我一直在用一个空项目进行测试,发现另一个标签属性会触发此警告:如果 numberOfLines 设置为除 1 以外的任何值,则无论您是否设置了 preferredMaxLayoutWidth,都会发生警告。 @MichaelG.Emmons 奇怪,我无法使用干净的项目和设置为 7.1 的部署目标来重现此问题。一旦我将preferredMaxLayoutWidth 设置为显式0,无论numberOfLines 值如何,警告都会消失。但也许这在今天早上的 Xcode 更新中已修复? 那么...是将行数设置为 1 并从代码中更改的唯一解决方案?这似乎不专业【参考方案10】:

我通过选择 W / H 选择中的原始布局来使其工作。情节提要按预期工作,错误消失了。

还要确保您正在为 iOS 8.0 进行开发。从项目的常规设置中检查。

This is where you should press.

【讨论】:

以上是关于自动首选最大布局宽度在 8.0 之前的 iOS 版本中不可用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局定义最大宽度约束?

iOS 8 上未返回正确的自动布局宽度

iOS自动布局两个UIView具有相等的宽度

如何在ios swift中以编程方式创建自动布局等宽度约束?

根据单元格宽度更改 UITableViewCell 内容的首选方法

iOS 自动布局:表格视图单元格宽度 = 0