我正在构建一个iOS Today小部件,在测试iOS 10时,我注意到所有小部件现在都被赋予相同的高度(之前的版本允许开发人员设置高度)。什么是理想高度/处理这个新限制的最佳做法是什么?我很快,我没有使用autolayout fyi。提前谢谢!
答案 0 :(得分:43)
在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;
}
}
运行你的目标,你会看到一个"显示更多"窗口小部件右上角的按钮。点击它,您将看到更改。
答案 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
类型。