今天iPad的扩展高度远远大于指定的高度

My Today扩展需要基于窗口小部件显示的内容具有dynamic高度。 我可以通过在最底部的元素上添加一个约束来实现:底部布局指南的顶部小于或等于底部最底部元素的底部,常数为0,优先级为999,乘数为1。

这与iPhone上的预期完全相同 – 小部件高度适合所有内容,并在显示下一个小部件之前应用默认的底部边距。

但在iPad上,它似乎将我的部件的高度设置为等于最大高度通知中心将允许一个部件 – 我的部件下面有很多空间,它几乎全屏。

我怎样才能删除额外的空间?

我确切地知道问题是什么,但不知道如何解决它 – 请参阅“问题”部分。 首先让我解释一下设置:

设置:
我把这个扩展的视图放在一个故事板上,没有任何事情是以编程的方式完成的。 视图由5个垂直堆叠的元素组成,其他一些水平排列。 这些是从上到下的垂直线的自动布局约束 – 没有说优先级是1000,乘数1:

UILabel: height = 35, top space to top layout guide with constant of 10 UIButton: equal height and width to a different button (whose aspect ratio is 1:1, there is no fixed width/height), top space to label 10 UIButton: equal height and width to same button, top space to above button 8 UIButton: equal height and width to same button, top space to above button 8 UIButton: equal height and width to same button, top space to above button 8, bottom space to bottom layout guide <= 0 with priority 999 

必要的行为:

  • 我需要一个位于单个全宽标签下面的4x4button
  • 每个button应该是完全相同的宽度和高度 – 所有完美的正方形
  • 最后一排button下面没有额外的空间

结果:
在这里输入图像说明

预期成果:
在这里输入图像说明

问题:
所有button上的宽高比约束最终间接强加一个“隐式”纵横比约束,当它被发送时,widget视图的高度为systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:在那里它通过必要宽度(724)所需的优先级和0的高度(压缩视图)在适配级优先级。 这导致iPad上的高窗口小部件视图在视图更宽的情况下开始。 但是没有可以消除的实际的纵横比约束。 实质上,因为我已经对所有的button应用纵横比约束,今天的扩展的高度是依赖于它的宽度(考虑所有的约束在一起,纵横比等)。 因此,扩展的高度在广泛的领域是不明显的,performance在像iPad这样的宽泛设备上。 button上的约束需要重新考虑,或者以某种方式调整。

示例项目:
演示此问题的示例项目可从CloudApp获得,以便您可以下载并使用它。

我试过的东西:
我试着通过覆盖widgetMarginInsetsForProposedMarginInsets去除默认的边距插入,并返回0作为底部。 这确实删除了默认的填充,因此降低了一点高度,但是它下面还有很多额外的空间。

UILabel有一个约束:标签的领先等于superview的领先 – 常量0,优先级1000,乘数1.如果我只是改变了超级视图的领先余量 ,额外的底部空间神奇消失。 我想知道是不是因为这个元素变得太大了,所以增加剩余空间的数量会减小它们的大小,但是我试着把它保持在正常的领先水平,并且增加了常数,这并没有解决问题。 但是这只能解决iPad上的问题。 它甚至没有完全解决它,每次你拉下通知中心,从大高度开始,然后收缩到适当的大小。 在风景中它永远不会收缩到适当的尺寸。

尝试解决scheme:

  • @Lefterisbuild议硬编码的大小,在这种情况下,这是行不通的,因为高度是dynamic的,并且该小部件可用于许多屏幕尺寸/方向。
  • @Yuyutsu试图解决它,但不幸的是不符合要求和展品相互冲突的约束和修改的布局。

在这里输入图像说明

以下是如何实现这一点:

  1. 你应该考虑你的约束。

  2. 您的小部件的默认边距插页没有按照您所需的方式正确configuration,因此通过调用“widgetMarginInsetsForProposedMarginInsets:”来自行设置是唯一的解决方法

/ /更新部件插页

 func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { println(NSStringFromUIEdgeInsets(defaultMarginInsets)) return UIEdgeInsetsMake(20, 20, 10, 20) } 

修改的示例文件链接: 修改的文件

我面临同样的问题。 你有没有添加底部填充约束如图所示? 在这里输入图像说明

这对我有用,希望它有帮助

我不得不在viewDidLoad委托方法上对小部件的值进行硬编码,以解决这个问题:

 import UIKit import NotificationCenter class TodayViewController: UIViewController, NCWidgetProviding { override func viewDidLoad() { super.viewDidLoad() self.preferredContentSize = CGSize(width: 0, height: 320) } }