新的iOS 10 Today Widget / Extension的高度是多少?

我正在构建一个iOS Today小部件,在测试iOS 10时,我注意到所有小部件现在都被赋予相同的高度(之前的版本允许开发人员设置高度)。 什么是理想高度/处理这个新限制的最佳做法是什么? 我很快,我没有使用autolayout fyi。 提前致谢!

在iOS 10中,默认情况下,今天窗口小部件的高度是固定的。 此外,折叠小部件的最小高度是有限的。

折叠小部件是大约两个半表行的高度。 理想情况下,扩展的小部件不会高于屏幕的高度。

这些说明来自iOS人机界面指南 。

我们可以做以下更改。

首先,您需要在viewDidLoad添加这些代码,这使得您的小部件支持两种iOS 10中的新模式。

Swift版本:

 if #available(iOSApplicationExtension 10.0, *) { // Xcode would suggest you implement this. extensionContext?.widgetLargestAvailableDisplayMode = .expanded } else { // Fallback on earlier versions } 

ObjC版本:

 self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded; 

然后实现协议方法,如:

Swift版本:

 @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 } } 

ObjC版本:

 - (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中的小部件已经发生了变化,您已经注意到并且现在具有固定的高度。 今天的扩展还增加了新function。 其中有NCWidgetDisplayMode 。 基本上你在右上角有一个按钮,你可以“显示更多”或“显示更少”。

首先将以下内容添加到viewDidLoad()

 self.preferredContentSize = CGSize(width: 0, height: 200) if #available(iOSApplicationExtension 10.0, *) { self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded } else { // Fallback on earlier versions } 

你需要做的是基本上添加以下方法:

Swift版本:

 @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版本仍然需self.preferredContentSize = CGSizeMake...

widgetActiveDisplayModeDidChange函数中,当您从“显示更多”>“显示更少”时,将调用activeDisplayMode == NCWidgetDisplayMode.Compact 。 这是因为它立即从iOS系统触发。 当您从“显示更少”>“显示更多”时,将调用activeDisplayMode == NCWidgetDisplayMode.Expanded

还有最后一件事,这仍然是“显示更多”和“显示更少”按钮,而Apple还没有解决这个问题。 查看 Apples Keynote 的演示 ,你会发现他有这个bug问题。

只需执行以下操作:

 let height = extensionContext?.widgetMaximumSize(for: .compact).height 

你可以使用: .compact.expanded类型。