我正在构建一个iOS Today小组件,在测试iOS 10时,我注意到所有的小组件现在都被赋予了相同的高度(以前的版本允许开发者设置高度)。那么这个新限制下的理想高度/最佳实践是什么?我用的是Swift,并且没有使用自动布局。提前感谢!
我正在构建一个iOS Today小组件,在测试iOS 10时,我注意到所有的小组件现在都被赋予了相同的高度(以前的版本允许开发者设置高度)。那么这个新限制下的理想高度/最佳实践是什么?我用的是Swift,并且没有使用自动布局。提前感谢!
iOS 10默认情况下,今日小组件的高度是固定的。此外,折叠小组件的最小高度也有限制。
折叠的小组件大约是两个半表格行的高度。展开的小组件理想情况下不应超过屏幕高度。
这些注释来自iOS人机界面指南。
我们可以通过以下方法进行更改。
首先,在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中小部件的高度?
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的演示,你会发现他在使用时也遇到了同样的问题。
let height = extensionContext?.widgetMaximumSize(for: .compact).height
.compact
和 .expanded
两种类型。