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

时间:2016-06-30 16:45:58

标签: ios objective-c swift ios10 today-extension

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

3 个答案:

答案 0 :(得分:43)

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

  

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

这些说明来自iOS Human Interface Guidelines

我们可以执行以下操作来更改它。

首先,您需要在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;
    }
}

运行你的目标,你会看到一个"显示更多"窗口小部件右上角的按钮。点击它,您将看到更改。

查看更多详情:How to resize the height of widget in iOS 10?

答案 1 :(得分: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的Check the demonstration你会发现他遇到了这个bug问题。

答案 2 :(得分:4)

只需执行以下操作:

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

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