【发布时间】:2016-11-02 21:35:48
【问题描述】:
我正在构建一个 iOS Today 小部件,在测试 iOS 10 时,我注意到所有小部件现在都被赋予了相同的高度(以前的版本允许开发人员设置高度)。什么是理想的高度/处理这个新限制的最佳实践是什么?我很快,我没有使用自动布局仅供参考。提前致谢!
【问题讨论】:
标签: ios objective-c swift ios10 today-extension
我正在构建一个 iOS Today 小部件,在测试 iOS 10 时,我注意到所有小部件现在都被赋予了相同的高度(以前的版本允许开发人员设置高度)。什么是理想的高度/处理这个新限制的最佳实践是什么?我很快,我没有使用自动布局仅供参考。提前致谢!
【问题讨论】:
标签: ios objective-c swift ios10 today-extension
在 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 中的小部件已更改,现在具有固定高度。今天的扩展还添加了新功能。其中一个是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 尚未修复。 Check the demonstration 来自 Apples Keynote,你会注意到他遇到了这个问题。
【讨论】:
只需执行以下操作:
let height = extensionContext?.widgetMaximumSize(for: .compact).height
您可以同时使用:.compact 和 .expanded 类型。
【讨论】: