【发布时间】:2014-07-25 03:24:12
【问题描述】:
如何在通知中心更改我的应用程序今日扩展的高度?
我使用 Interface Builder 和 Code 进行了尝试, Interface Builder 显示高度为 600 的视图,但它没有在设备上应用此高度。
看来我不能让它大于大约 80 像素...
【问题讨论】:
标签: ios ios8 xcode6 ios-app-extension
如何在通知中心更改我的应用程序今日扩展的高度?
我使用 Interface Builder 和 Code 进行了尝试, Interface Builder 显示高度为 600 的视图,但它没有在设备上应用此高度。
看来我不能让它大于大约 80 像素...
【问题讨论】:
标签: ios ios8 xcode6 ios-app-extension
在您的小部件UIViewController.m(Objective-C)中:
self.preferredContentSize = CGSizeMake(0, 200);
将使您的小部件的高度为 200。
请注意,宽度不会影响视图,因为小部件必须适合通知中心的确切宽度,这是自动处理的。
另外,如果你想动画改变你的视图高度,你可以实现(Objective-C):
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
在您的视图控制器中使用-animateAlongsideTransition:completion:
答案有点隐蔽;您必须在文档侧边栏中四处点击才能最终找到 this fantastic document。
【讨论】:
Today 扩展有两种显示方式:
无论您在紧凑模式下更改扩展高度的任何代码都不会产生任何影响。所以你需要将模式从紧凑模式更改为扩展模式。
// 1. Load This in viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
}
// 2. Implement another widget protocol
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize){
if (activeDisplayMode == NCWidgetDisplayMode.compact) {
self.preferredContentSize = maxSize;
}
else {
self.preferredContentSize = CGSize(width: 0, height: 200);
}
}
您可以参考 WWDC 了解更多关于应用扩展的更新
【讨论】:
widgetActiveDisplayModeDidChange 仅适用于 iOS 10 及更高版本。
由于 iOS 10 扩展的高度是 110 像素。您应该使用新的协议方法widgetActiveDisplayModeDidChange:withMaximumSize: 来扩展扩展大小(Objective-C):
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode
withMaximumSize:(CGSize)maxSize {
if (activeDisplayMode == NCWidgetDisplayModeExpanded) {
self.preferredContentSize = CGSizeMake(maxSize.width, 600.0);
} else if (activeDisplayMode == NCWidgetDisplayModeCompact) {
self.preferredContentSize = maxSize;
}
}
此外,您可能需要在今天的视图控制器的 viewDidLoad 方法中调用您的扩展上下文中的 setWidgetLargestAvailableDisplayMode:,如下所示(Objective-C):
if ([self.extensionContext respondsToSelector:@selector(setWidgetLargestAvailableDisplayMode:)]) { // iOS 10+
[self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded];
} else {
self.preferredContentSize = CGSizeMake(0, 600.0); // iOS 10-
}
【讨论】:
extensionContext?.widgetLargestAvailableDisplayMode = .expanded才能获得展开模式。
今日小部件默认 UIEdgeInsets defaultMarginInsets (UIEdgeInsets) defaultMarginInsets = (top = 0, left = 44, bottom = 39, right = 0)
你应该添加这个方法
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0);
return edgeInsets;}
【讨论】:
最好的方法当然是自动布局,但默认情况下,您可以像这样控制边距
func widgetMarginInsetsForProposedMarginInsets
(defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
return UIEdgeInsetsZero
}
【讨论】:
小部件的高度由系统调整。如果您使用约束定义了您的高度,这将根据需要自动调整。如果您使用显式布局,您可以通过修改小部件的preferredContentSize 来请求新高度。
请注意,您不能保证通知中心会尊重您的身高要求:它可能会自动调整,可能会调整但未调整到您想要的确切高度,或者根本不会接受。
开发小部件的最佳方法是使用自动布局约束来设置您的高度值,这样您的小部件将轻松适应不同的高度。
【讨论】: