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

我将“今日扩展”添加为我的应用程序的目标,删除了小部件根视图内的默认“Hello World”标签,并在其位置添加了一个简单的UIView。我给视图添加了一个黄色,并将其固定在根视图的所有边缘上,就像约束标签一样。然后,我向黄色视图添加了另一个约束,以使其固定高度为100px。

ios - 今天不一致的窗口小部件行为打破了 subview 的高度限制-LMLPHP

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

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

ios - 今天不一致的窗口小部件行为打破了 subview 的高度限制-LMLPHP
ios - 今天不一致的窗口小部件行为打破了 subview 的高度限制-LMLPHP

我发现底部的 39px边距defaultMarginInsets方法中widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets)参数传入的今日小部件的默认底部边距,并且我可以通过重写此方法并提供自己的边距来解决此不一致的行为插图:

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets {
    var newInsets = defaultMarginInsets
    newInsets.bottom = 20
    return newInsets
}

但是,我确实更喜欢使用系统提供的边距而不是固定值。在我看来,这是有关Today小部件的另一个iOS错误。是吗?如果没有,我该如何解决?

最佳答案

尽量避免使用别针。

要进行定位,请依靠使视图与 super 视图的前缘,后缘,顶部或底部边缘对齐。

要调整大小,请尝试将视图设置为与父视图具有相同的高度或宽度。并根据需要调整乘数。

这解决了我在“今日”小部件中遇到的自动布局不一致问题。

更新了屏幕截图:

ios - 今天不一致的窗口小部件行为打破了 subview 的高度限制-LMLPHP

参见上文,我正在使用对齐菜单(而不是引脚菜单)。我同时选择我要限制的视图以及所有包围的 super 视图,并告诉先验者分享(或让对齐)尾随和底部边缘。

我知道这不是苹果公司可能会演示的方法,但是这是一种避免使用在Today Widgets中使用引脚时发生的错误的解决方法。

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

ios - 今天不一致的窗口小部件行为打破了 subview 的高度限制-LMLPHP

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

关于ios - 今天不一致的窗口小部件行为打破了 subview 的高度限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37010292/

10-16 23:34