我在刚刚为我的应用程序创建的 Today Widget 中观察到一个关于自动布局的非常奇怪的行为。 为了找到问题的根源,我最终创建了一个普通的新 Xcode 项目(单 View 应用程序)并添加了一个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
,它强制 View 的高度为 0。我检查并发现引用的 View 是小部件的 Root View 本身。因此,由于某种超出我理解的原因,系统在内部创建了一个 0 像素高度约束,该约束与 Interface Builder 中的 View 设置冲突。 (当您在 Xcode 中创建一个全新的 today 扩展时,您将看到,除了一个固定到小部件 Root View 每一侧的 UILabel 之外,什么都没有。)
通常我会声称这是一个巨大的 iOS 错误,但由于这是 Apple 用于创建 Today Widgets 的 默认 模板,我无法相信它已损坏。知道是什么导致了这种冲突行为以及如何解决它(正确地)吗?
我基本上想通过赏金实现什么......
... 是找出是否有一种可靠的方法在 Today Widget 中使用自动布局而不引入一些变通方法和“肮脏的黑客 strong>”,你不会在普通应用程序中使用它。 (如果您最终添加了大量创建固定框架的约束并且不让内容动态增长,那不是真正的 Autolayout 理念,对吗?)
密切相关的问题是问题的一部分,可能会给出提示:
Inconsistent Today Widget behavior breaks subview's height constraints
最佳答案
在苹果的部分库存中UIView
子类,它们被实例化为零大小。您需要配置您的 NSLayoutConstraint
s 以便他们可以正确地对此初始大小使用react。过去,我将顶部或底部约束设为不等式,以便其余约束可以正确调整自身大小而不破坏布局。
例如:将底部约束 ( <NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]>
) 设置为 LessThanOrEqualTo
用constant
8.0
的值.
关于ios - 默认今日小部件中的布局约束冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37009679/