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

use*_*503 23 objective-c ios swift today-extension ios10

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

yys*_*yys 44

在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
}
Run Code Online (Sandbox Code Playgroud)

ObjC版本:

self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
Run Code Online (Sandbox Code Playgroud)

然后实现协议方法,如:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

运行目标,您将在窗口小部件的右上角看到"显示更多"按钮.点按它,您将看到更改.

查看更多细节:如何调整iOS 10中小部件的高度?


Ras*_*n L 9

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
}
Run Code Online (Sandbox Code Playgroud)

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

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
    }

}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意两件事:

Xcode会自动建议您添加iOS版本的可用检查(至少对于Swift).所以不要删除旧的方法来执行此操作 self.preferredContentSize = CGSizeMake....旧的iOS版本仍然需要这样做.

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

最后一件事,这仍然是"显示更多"和"显示更少"按钮,而苹果还没有修复它.查看 Apples Keynote 的演示,您会发现他遇到了这个bug问题.