My Today扩展程序需要具有基于窗口小部件显示内容的动态高度。我能够通过在我最底层的元素上添加一个约束来实现这一点:底部布局指南的顶部小于或等于最底层元素的底部,常量为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
必要的行为:
结果:
预期结果:
问题:
对所有按钮的宽高比限制最终间接地对窗口小部件视图的高度进行“隐式”宽高比约束,当它被发送systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:
时,它会传递必要的宽度(724)以进行布局。在拟合水平优先级下所需的优先级和高度为0(以压缩视图)。这导致iPad上的高小部件视图开始时视图更宽。但是没有可以删除的实际宽高比约束。本质上,因为我已经将宽高比约束应用于所有按钮,所以今天扩展的高度取决于其宽度(考虑所有约束,宽高比等)。因此,扩展的高度在广泛的区域中是笨拙的,在iPad等宽的设备上表现出来。需要重新考虑对按钮的限制,或以某种方式进行调整。
示例项目:
CloudApp提供sample project that demonstrates the issue,您可以下载并使用它。
我尝试过的事情:
我尝试通过覆盖widgetMarginInsetsForProposedMarginInsets
并返回底部的0
来删除默认的边距。这确实删除了默认的填充,因此降低了一点高度,但是它下面还有很多额外的空间。
UILabel
有一个约束:标签的前导等于超级视图的前导 - 常数0,优先级1000,乘数1.如果我只是将其更改为超级视图的前导边距,额外的底部间距神奇地消失了。我想知道是不是因为元素变得太大,所以增加左边距会减少它们的大小,但是我试着将它设置为常规前导并增加常量并且没有解决问题。但这只能解决iPad中的问题。它甚至没有完全解决它,每次你拉下通知中心它从大高度开始然后缩小到适当的大小。在景观中它永远不会收缩到适当的大小。
尝试解决方案:
答案 0 :(得分:2)
以下是如何实现这一目标的:
你应该考虑你的约束。
您的小部件默认边距插入没有按照您希望的方式正确配置,因此通过调用&#39; widgetMarginInsetsForProposedMarginInsets:&#39;
<来自行设置此方法是唯一的解决方法/ LI> 醇>//更新小部件插图
func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets {
println(NSStringFromUIEdgeInsets(defaultMarginInsets))
return UIEdgeInsetsMake(20, 20, 10, 20)
}
修改的示例文件链接: Modified file
答案 1 :(得分:0)
答案 2 :(得分:-1)
我必须在viewDidLoad
委托方法上对小部件的值进行硬编码才能解决此问题:
import UIKit
import NotificationCenter
class TodayViewController: UIViewController, NCWidgetProviding {
override func viewDidLoad() {
super.viewDidLoad()
self.preferredContentSize = CGSize(width: 0, height: 320)
}
}