iOS8今天扩展使用只有自动布局的高度给破坏的约束

Apple文档build议使用自动布局设置Today Extensions的高度。

如果一个小部件有额外的内容要显示,你可以依靠自动布局约束来适当调整小部件的高度。 如果您不使用自动布局,则可以使用UIViewController属性preferredContentSize指定窗口小部件的新高度。

但是,我看到的每个示例和教程都使用preferredContentSize

我所有尝试通过自动布局来设置高度的方法都会导致警告。

通过Autolayout设置高度

我开始使用新的xcode模板,以及新的今天的扩展模板。 我添加到TodayViewController.m是:

 - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets { return UIEdgeInsetsMake(0, 0, 0, 0); } 

注意:如果我只使用默认页边距,我仍然遇到这个问题。

我限制了标签高度,将容器中的标签居中,并将容器高度限制为与标签高度相同:

约束高度

这应该导致一个标签,在指定的高度填充容器,没有约束冲突。 相反,我得到一个约束冲突:

 2014-09-28 10:27:39.254 TodayExtension[61090:2672196] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "<NSLayoutConstraint:0x7f8b8b62c670 V:[UILabel:0x7f8b8b62d9b0'Hello World'(124)]>", "<NSLayoutConstraint:0x7f8b8b583020 UIView:0x7f8b8b62d6e0.height == UILabel:0x7f8b8b62d9b0'Hello World'.height>", "<NSLayoutConstraint:0x7f8b8b5888a0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7f8b8b62d6e0(667)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7f8b8b62c670 V:[UILabel:0x7f8b8b62d9b0'Hello World'(124)]> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

它打破了约束的方式,它实际上最终看起来像我希望: 约束高度视图

但是,在其他项目中,它决定打破其他限制,看起来不正确。 另外,注意:如果我尝试改变高度约束的优先级,它会使Xcode崩溃。 所以这很有趣。

不限制身高

我曾经希望,由于限制高度不起作用,也许如果我没有限制子视图的容器高度,也许它会找出所需的高度来容纳子视图,并正确地设置。

我集中了子视图并且限制了它的高度: i.imgur.com/PwLmhj9.png

这只会导致扩展程序占用了通知中心的全部高度,并且我的大小正确的视图垂直居中:

i.imgur.com/kKXlocu.png

如果我不居中,而是将垂直空间固定到顶部布局指南,我会得到相同的东西,除了子视图固定在顶部(但容器仍然巨大)。

是什么赋予了?

我知道我可以使用preferredContentSize ,但为什么苹果会说可以使用自动布局约束来设置? 我究竟做错了什么?

我给出的例子显然是做作的。 我正在设置视图的高度,为什么不直接设置容器的高度呢? 在实际的项目中,这一点的一部分就是仅使用自动布局来设置基于宽度的小部件的高度。

经过一些试验,并且在“ 什么是NSLayoutConstraint”“UIView-Encapsulated-Layout-Height”这个问题上陷入困境,我应该如何强迫它重新计算干净 “我确定你可以使用”Height“和”Equal Heights“或“高度”和顶部和底部“垂直空间”( Guilherme Sprintbuild议),然后将高度限制的“优先级”降低到999。

高度约束与优先级降低

这不是我希望的答案, 它确实通过子视图的自动布局来指定容器的高度,并且避免了关于破坏约束的任何警告。

我完全不科学的猜测/假设/结论是,iOS正确地查看布局约束来确定容器视图的高度。 然后,它添加一个新的约束,它与刚刚计算的高度相同,但现在过度限制高度。 减less原始开发人员指定的高度约束的优先级意味着系统生成的约束胜出,并且不会产生警告(希望能够从实际知道的人那里获得更多的信息)。

您应该总共定义5个约束条件,使Today Extension成为您真正想要的大小。

4个约束将定义与超视图的关系:

  • 顶层空间
  • 底部空间
  • 领先的空间
  • 尾随空间

顺便说一下,您应该将此限制绑定到布局页边距,Applebuild议您查看,特别是“今日扩展”。

第五个约束将是子视图的高度 。 这个限制与顶部和底部空间一起,将在“今日”选项卡中定义您的部分的确切大小。

Xcode今天扩展约束

只是解释说,高度约束将为子视图设置一个常量,顶部和底部约束将“超级视图”粘贴到子视图边缘。

今天延伸运行

标签的高度使得不可能同时满足这些限制:

  • 标出最小高度
  • 顶层空间到Superview
  • 最底层的空间来监督

您可以通过删除底部空间到超级查看约束来解决它,自动布局系统将为底部空间分配剩余空间。