布局约束在默认今日小组件冲突

我在我刚刚为我的应用程序创build的“今日”小工具中观察到了有关Autolayout的非常奇怪的行为。 试图find问题的根源,我最终创build了一个纯粹的新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。 我检查并认为引用的视图是widget的根视图本身。 所以出于某种原因,这超出了我的理解,系统内部创build了一个0像素高度约束,与Interface Builder中视图的设置相冲突。 (正如您在Xcode中创build新的扩展时所看到的那样,除了一个固定在小部件根视图两侧的UILabel外,没有其他的东西。

通常我会声称这是一个巨大的iOS错误,但因为这是苹果的默认模板创build今天的小工具,我简直不敢相信它是坏的。 任何想法是什么导致这种冲突的行为,以及如何解决它( 正确 )?


我基本上试图用赏金来实现…

…是要找出是否有一个可靠的方法来使用Autolay在今天的小工具, 而不会引入几个解决方法和“ 脏黑客 ”,你不会在一个正常的应用程序内使用。 (如果你最终增加了大量的创build固定帧的约束,而不是让内容dynamic增长,这不是真正的Autolayout的想法,是吗?)


密切相关的问题是问题的一部分,可能会提示:
当前不一致的小部件行为会破坏子视图的高度限制

在苹果股票的一些UIView子类中,它们被实例化为零大小。 您需要configuration您的NSLayoutConstraint s,以便他们可以正确地对这个初始大小作出反应。 在过去,我已经使顶部或底部的约束成为一个不等式,以便剩下的约束可以正确地调整自己的大小,而不会破坏布局。

例如:使你的底部约束( <NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]>LessThanOrEqualTo与一个constant数值8.0

我发现有用的方法是限制顶部和底部的视图,水平居中,并限制宽度。 这使我在今天的小工具上取得了不错的成绩。