Apple 文档建议使用自动布局设置 Today Extensions 的高度。
如果小部件有额外的内容要显示,您可以依靠自动布局约束来适当地调整小部件的高度。如果不使用 Auto Layout,可以使用 UIViewController 属性 preferredContentSize 来指定小部件的新高度。
但是,我看到的每个示例和教程最终都使用preferredContentSize
.
我所有通过自动布局设置高度的尝试都会导致约束被破坏的警告。
通过自动布局设置高度
我从一个新的 xcode 模板和一个新的 Today 扩展模板开始。我添加的唯一内容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 崩溃。所以这很有趣。
不限制高度
我曾希望由于限制高度不起作用,也许如果我没有将容器高度限制到子视图,它可能会找出容纳子视图所需的高度并正确设置自己。
我将子视图居中并限制了它的高度:
这只是导致扩展使用了通知中心的整个高度,并且我正确大小的视图垂直居中:
如果我不居中,而是将垂直空间固定到顶部布局指南,我会得到相同的结果,只是子视图固定在顶部(但容器仍然很大)。
是什么赋予了?
我知道我可以只使用preferredContentSize
,但是为什么 Apple 会说它可以使用自动布局约束来设置呢?我究竟做错了什么?
我给出的例子显然是人为的。我正在设置视图的高度,那为什么不直接设置容器的高度,对吧?在实际项目中,部分要点是仅使用自动布局根据宽度设置小部件的高度。