今天不一致Widget行为会破坏子视图的高度限制

时间:2016-05-03 17:10:58

标签: ios autolayout today-extension

这个问题与我刚刚在Stackoverflow上发布的另一个问题有关:
Layout Constraint Conflicts in Default Today Widget

我将Today Extension作为目标添加到我的应用程序中,删除了小部件根视图中的默认“Hello World”标签,并在其位置添加了一个简单的UIView。我给视图一个黄色并将其固定到根视图的所有边缘 - 与标签约束的方式相同。然后我在黄色视图中添加了另一个约束,以使其固定高度为100px。

Widget Storyboard

当我启动应用程序(在模拟器设备上测试)高度约束被忽略时,黄色视图占用整个可用空间一直到下一个小部件的标题。

当我向上滑动通知中心并再次向下拉时,视图突然跳起(似乎突然“看到”自己的高度限制)在小部件的底部留下39px的垂直空白区域:

First launch Subsequent launches

我认为底部的 39px边距是今天窗口小部件的默认底部边距,由defaultMarginInsets参数传入{{ 1}}方法,我可以通过重写这个方法并提供我自己的边距插入来修复这种不一致的行为:

widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets)

但是,我更愿意使用系统提供的边距而不是固定值。在我看来,这是关于今天小部件的另一个iOS错误。是吗?如果没有:我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

尽量避免使用别针。

对于定位,请依靠将视图与超视图的前缘,尾部,顶部或底部边缘对齐。

对于尺寸调整,请尝试将视图设置为与superview具有相同的高度或宽度。并根据需要调整乘数。

这解决了我在Today Widget中遇到的自动布局不一致。

更新了w / screenshot:

enter image description here

见上文,我使用对齐菜单(引脚菜单)。我选择了我想要约束的视图,以及所有包含的超视图,并告诉先前共享(或对齐)尾随和底边。

我知道这不是Apple可能会如何演示它,但它是一种解决方法,可以避免使用今日小部件的引脚时出现的错误。

更新#2 - 这里是所有约束(包括高度和宽度):

enter image description here

错误必须与完全固定的视图的推断大小相关,因为当我将视图的高度和宽度设置为相对于其超级视图(而不是推断它)时,错误不会发生。