我在刚刚为我的应用程序创建的“今日小部件”中观察到有关自动布局的非常奇怪的行为。
试图找到问题的根源,我最终创建了一个简单的新的 Xcode 项目(单视图应用程序)并添加了今天扩展作为新目标- 甚至没有碰它。
当我在我的设备 (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 的default用于创建今日小部件的模板我简直不敢相信它已经损坏了。知道是什么导致了这种冲突行为以及如何解决它(properly)?
我基本上想用赏金实现什么......
...是为了弄清楚是否存在可靠的方式在今日小部件中使用自动布局without介绍了几种解决方法和“肮脏的黑客“您不会在普通应用程序中使用它。(如果您最终添加了大量创建固定框架的约束并且不让内容动态增长,那么这并不是真正的自动布局的想法,是吗?)
密切相关的问题是问题的一部分,可能会给出提示:
不一致的 Today Widget 行为打破了子视图的高度限制