我正在构建一个 iOS Today 小部件,在测试 iOS 10 时,我注意到所有小部件现在都被赋予了相同的高度(以前的版本允许开发人员设置高度)。什么是理想的高度/处理这个新限制的最佳实践是什么?我很快,我没有使用自动布局仅供参考。提前致谢!
3 回答
在 iOS 10 中,默认情况下,今天小部件的高度是固定的。此外,折叠小部件的最小高度是有限的。
折叠的小部件是大约两个半表格行的高度。理想情况下,展开的小部件不高于屏幕高度。
这些注释来自iOS Human Interface Guidelines。
我们可以执行以下操作来更改它。
首先,你需要在你的 中添加这些代码viewDidLoad
,这使得你的小部件支持 iOS 10 中新增的两种模式。
斯威夫特版本:
if #available(iOSApplicationExtension 10.0, *) { // Xcode would suggest you implement this.
extensionContext?.widgetLargestAvailableDisplayMode = .expanded
} else {
// Fallback on earlier versions
}
对象版本:
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
然后实现协议方法,如:
斯威夫特版本:
@available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
if activeDisplayMode == .expanded {
preferredContentSize = CGSize(width: 0.0, height: 200.0)
} else if activeDisplayMode == .compact {
preferredContentSize = maxSize
}
}
对象版本:
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {
if (activeDisplayMode == NCWidgetDisplayModeExpanded) {
self.preferredContentSize = CGSizeMake(0.0, 200.0);
} else if (activeDisplayMode == NCWidgetDisplayModeCompact) {
self.preferredContentSize = maxSize;
}
}
运行您的目标,您将在小部件的右上角看到一个“显示更多”按钮。点击它,你会看到变化。
查看更多详细信息:如何在 iOS 10 中调整小部件的高度?
如您所见,iOS 10 中的小部件已更改,并且现在具有固定高度。今天的扩展还添加了新功能。其中之一是NCWidgetDisplayMode
. 基本上,您在右上角有一个按钮,您可以在其中“显示更多”或“显示更少”。
首先将以下内容添加到您的viewDidLoad()
self.preferredContentSize = CGSize(width: 0, height: 200)
if #available(iOSApplicationExtension 10.0, *) {
self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
} else {
// Fallback on earlier versions
}
然后你需要做的是基本上添加以下方法:
斯威夫特版本:
@available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
if activeDisplayMode == NCWidgetDisplayMode.Compact {
self.preferredContentSize = CGSizeMake(0.0, 200.0)
}
else if activeDisplayMode == NCWidgetDisplayMode.Expanded {
self.preferredContentSize = desiredSize
}
}
Objective-C 版本:
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
if (activeDisplayMode == NCWidgetDisplayModeCompact){
self.preferredContentSize = CGSizeMake(0.0, 200.0);
}
else if (activeDisplayMode == NCWidgetDisplayModeExpanded){
self.preferredContentSize = desiredSize;
}
}
这里注意两点:
Xcode 会自动建议您为 iOS 版本添加可用的检查(至少对于 Swift)。所以不要删除旧的方法来执行此 self.preferredContentSize = CGSizeMake...
操作对于旧的 iOS 版本仍然需要。
当您从“显示更多”>“显示更少”时,将调用该widgetActiveDisplayModeDidChange
函数。activeDisplayMode == NCWidgetDisplayMode.Compact
这是因为它会立即从 iOS 系统触发。activeDisplayMode == NCWidgetDisplayMode.Expanded
当您从“显示更少”>“显示更多”时将被调用。
最后一件事,“显示更多”和“显示更少”按钮仍然存在问题,Apple 尚未修复。检查 Apples Keynote 的演示,你会注意到他有这个错误问题。
只需执行以下操作:
let height = extensionContext?.widgetMaximumSize(for: .compact).height
您可以同时使用:.compact
和.expanded
类型。