今天iPad的扩展高度比指定

时间:2015-05-19 04:05:42

标签: ios ios8 autolayout ios-app-extension ios8-today-widget

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

必要的行为:

  • 我需要一个位于单个全角标签下方的4x4按钮网格
  • 每个按钮应该是完全相同的宽度和高度 - 所有完美的正方形
  • 最后一排按钮下方没有多余空间

结果:
enter image description here

预期结果:
enter image description here

问题:
对所有按钮的宽高比限制最终间接地对窗口小部件视图的高度进行“隐式”宽高比约束,当它被发送systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:时,它会传递必要的宽度(724)以进行布局。在拟合水平优先级下所需的优先级和高度为0(以压缩视图)。这导致iPad上的高小部件视图开始时视图更宽。但是没有可以删除的实际宽高比约束。本质上,因为我已经将宽高比约束应用于所有按钮,所以今天扩展的高度取决于其宽度(考虑所有约束,宽高比等)。因此,扩展的高度在广泛的区域中是笨拙的,在iPad等宽的设备上表现出来。需要重新考虑对按钮的限制,或以某种方式进行调整。

示例项目:
CloudApp提供sample project that demonstrates the issue,您可以下载并使用它。

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

UILabel有一个约束:标签的前导等于超级视图的前导 - 常数0,优先级1000,乘数1.如果我只是将其更改为超级视图的前导边距,额外的底部间距神奇地消失了。我想知道是不是因为元素变得太大,所以增加左边距会减少它们的大小,但是我试着将它设置为常规前导并增加常量并且没有解决问题。但这只能解决iPad中的问题。它甚至没有完全解决它,每次你拉下通知中心它从大高度开始然后缩小到适当的大小。在景观中它永远不会收缩到适当的大小。

尝试解决方案:

  • @Lefteris建议硬编码大小,在这种情况下不起作用 因为高度是动态的,并且小部件可用于许多屏幕 尺寸/方位。
  • @Yuyutsu试图解决它,但遗憾的是它不符合要求并展示了相互矛盾的约束和修改过的布局。

3 个答案:

答案 0 :(得分:2)

enter image description here

以下是如何实现这一目标的:

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

  2. 您的小部件默认边距插入没有按照您希望的方式正确配置,因此通过调用&#39; widgetMarginInsetsForProposedMarginInsets:&#39;

    <来自行设置此方法是唯一的解决方法/ LI>

    //更新小部件插图

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

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

答案 1 :(得分:0)

我遇到了同样的问题。您是否添加了底部填充约束,如图所示? enter image description here

这对我有用。希望它有所帮助

答案 2 :(得分:-1)

我必须在viewDidLoad委托方法上对小部件的值进行硬编码才能解决此问题:

import UIKit
import NotificationCenter

class TodayViewController: UIViewController, NCWidgetProviding {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.preferredContentSize = CGSize(width: 0, height: 320)
    }

}