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

23

我正在构建一个iOS Today小组件,在测试iOS 10时,我注意到所有的小组件现在都被赋予了相同的高度(以前的版本允许开发者设置高度)。那么这个新限制下的理想高度/最佳实践是什么?我用的是Swift,并且没有使用自动布局。提前感谢!

3个回答

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
}

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


谢谢您提供完整的指导! - Mona

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
}

你需要做的是基本上添加以下方法: 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上仍然需要。

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

最后提醒一件事,这个“显示更多”和“显示更少”的按钮还存在漏洞,并且尚未被Apple修复。可以查看Apples Keynote的演示,你会发现他在使用时也遇到了同样的问题。


1
点赞发现了苹果的漏洞,这也展示了他们如何像大师一样逃脱困境。 :) - Almas Adilbek

4
只需要按照以下步骤操作:
let height = extensionContext?.widgetMaximumSize(for: .compact).height

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

这真的是一种很酷的方式。我寻找了很多并尝试在像viewDidAppear和viewWillTransition这样的生命周期回调中获取正确的大小。但这些方法并不理想。因为在回调中设置正确的框架会导致小部件看起来刷新和重绘,这是不愉快的。谢谢。我可以使用这个方法在viewDidLoad中设置正确的框架。 - Victor Choy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接