【发布时间】:2016-05-03 16:38:22
【问题描述】:
我在刚刚为我的应用程序创建的 Today Widget 中观察到关于 Autolayout 的非常奇怪的行为。 试图找到问题的根源,我最终创建了一个普通的 新 Xcode 项目(单视图应用程序)并添加了一个 Today Extension 作为新目标 - 甚至没有触及它。
当我在我的设备 (iPhone 6s) 上启动 Today Extension 时,首先发生的事情是控制台中引发了布局约束冲突:
2016-05-03 18:17:22.216 TodayExtension[10183:4611907] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<_UILayoutSupportConstraint:0x15c665320 V:[_UILayoutGuide:0x15c6657b0(0)]>",
"<_UILayoutSupportConstraint:0x15c663890 V:|-(0)-[_UILayoutGuide:0x15c6657b0] (Names: '|':UIView:0x15c6642a0 )>",
"<_UILayoutSupportConstraint:0x15c666010 V:[_UILayoutGuide:0x15c666380(0)]>",
"<_UILayoutSupportConstraint:0x15c666ed0 _UILayoutGuide:0x15c666380.bottom == UIView:0x15c6642a0.bottom>",
"<NSLayoutConstraint:0x15c666b80 V:[_UILayoutGuide:0x15c6657b0]-(NSSpace(8))-[UILabel:0x15c6617c0'Hello World']>",
"<NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]>",
"<NSLayoutConstraint:0x15c552820 'UIView-Encapsulated-Layout-Height' V:[UIView:0x15c6642a0(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]>
您会注意到列表中的最后一个约束是UIView-Encapsulated-Layout-Height,它强制视图的高度为 0。我检查并发现引用的视图是小部件的根视图本身。因此,出于某种我无法理解的原因,系统在内部创建了一个 0 像素高度约束,该约束与 Interface Builder 中的视图设置冲突。 (当您在 Xcode 中创建一个全新的 Today 扩展时,您将看到,除了固定在小部件根视图的每一侧的 UILabel 之外,什么都没有。)
通常我会声称这是一个巨大的 iOS 错误,但由于这是 Apple 用于创建 Today Widgets 的 默认 模板,我简直不敢相信它已经坏了。知道是什么导致了这种冲突行为以及如何解决它(正确)?
我基本上想通过赏金实现什么......
... 是要弄清楚是否有一种可靠的方式可以在 Today Widget 中使用自动布局而不引入一些变通方法和“肮脏的黑客攻击 strong>”,您不会在普通应用程序中使用。 (如果你最终添加了大量创建固定帧的约束并且不让内容动态增长,那不是 Autolayout 的真正想法,是吗?)
密切相关的问题是问题的一部分,可能会给出提示:
Inconsistent Today Widget behavior breaks subview's height constraints
【问题讨论】:
-
你试过用
widgetMarginInsetsForProposedMarginInsets添加边距吗? -
是的,我做到了。我在上面链接的另一个问题中对此进行了解释。
-
@EICaptainv2.0:感谢您提供帮助。但首先,如果我删除底部约束,Today 小部件将不再随标签的内容增长(如果您在标签内放置 10 行文本,它将与小部件的边界重叠)。其次,我已经成功实现了一个带有一些肮脏黑客的小部件,但我在这里想要实现的是找到需要这些黑客的原因以及一个通用解决方案以正确使用 Autolayout今天的小部件。整个社区都可以从中受益,可以应用于任何小部件布局。
-
@EICaptainv2.0:再次感谢您的帮助。但是,如果您没有发布 cmets 并在我回复它们后再次删除它们,那就太好了。对于阅读此页面的其他用户,我的 cmets 将脱离上下文,没有人会理解发生了什么。
-
@Mischa 那是因为我会提供详细的答案...
标签: ios xcode autolayout today-extension