我在今天为我的应用创建的今日小部件中发现了一个非常奇怪的关于Autolayout的行为。 试图找到问题的根源我最终创建了一个简单的新的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中创建一个全新的扩展时所看到的那样,除了一个UILabel固定在小部件的根视图的每一侧之外,没什么。)
通常情况下,我会声称这是一个巨大的iOS错误,但由于这是用于创建Today Widgets的Apple的默认模板,我简直无法相信它已被破坏。知道造成这种冲突行为的原因以及解决方法(正确)吗?
...是要确定是否有可靠方式在今日小工具中使用Autolayout而不引入几种解决方法&#34; 脏黑客&#34;你不会在普通的应用程序中使用。 (如果您最终添加了大量创建固定帧的约束,并且不让内容动态增长,而不是Autolayout的想法,是吗?)
密切相关的问题是问题的一部分,可能会给出一个提示:
Inconsistent Today Widget behavior breaks subview's height constraints
答案 0 :(得分:2)
在Apple的一些股票dmarced.core> (def txt-strings-method (doto (.getDeclaredMethod TXTBase "getStrings" nil) (.setAccessible true)))
#'dmarced.core/txt-strings-method
dmarced.core> (defn get-txt-strings [r]
(.invoke m r nil))
#'dmarced.core/get-txt-strings
dmarced.core> (get-txt-strings r)
["v=spf1 include:_spf.google.com ~all"]
dmarced.core>
子类中,它们的实例化大小为零。您需要配置UIView
s,以便他们能够对此初始大小做出正确反应。在过去,我已经将顶部或底部约束设为不等式,以便其余约束可以正确地调整自身大小而不会破坏布局。
例如:将您的底部约束(NSLayoutConstraint
)设为<NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]>
,LessThanOrEqualTo
值为constant
。
答案 1 :(得分:1)
我发现有用的方法是限制顶部和底部的视图,水平居中并限制宽度。这使我在今天的小工具上取得了很好的成绩。