23

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

4

3 回答 3

44

在 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 中调整小部件的高度?

于 2016-07-29T05:44:45.077 回答
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
}

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

斯威夫特版本:

@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 的演示,你会注意到他有这个错误问题。

于 2016-09-18T07:02:57.600 回答
4

只需执行以下操作:

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

您可以同时使用:.compact.expanded类型。

于 2017-04-28T08:30:29.043 回答