如何在通知中心更改我的应用程序今日扩展的高度?
我使用 Interface Builder 和 Code 进行了尝试,Interface Builder 显示高度为 600 的视图,但它没有在设备上应用此高度。
看来我不能让它大于大约 80 像素...
如何在通知中心更改我的应用程序今日扩展的高度?
我使用 Interface Builder 和 Code 进行了尝试,Interface Builder 显示高度为 600 的视图,但它没有在设备上应用此高度。
看来我不能让它大于大约 80 像素...
在您的小部件UIViewController.m
(Objective-C)中:
self.preferredContentSize = CGSizeMake(0, 200);
将使您的小部件的高度为 200。
请注意,宽度不会影响视图,因为小部件必须适合通知中心的确切宽度,这是自动处理的。
此外,如果您想动画化视图高度的变化,您可以实现(Objective-C):
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
在您的视图控制器中使用-animateAlongsideTransition:completion:
答案有点隐蔽;您必须在文档侧边栏中四处点击才能最终找到这个出色的文档。
小部件的高度由系统调整。如果您使用约束定义了您的高度,这将根据需要自动调整。如果您使用显式布局,则可以通过修改preferredContentSize
小部件的 来请求新高度。
请注意,您不能保证通知中心会尊重您的身高要求:它可能会自动调整,可能会调整但未调整到您想要的确切高度,或者根本不会得到尊重。
开发小部件的最佳方法是使用自动布局约束来设置您的高度值,这样您的小部件将轻松适应不同的高度。
由于 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;
}
}
此外,您可能需要setWidgetLargestAvailableDisplayMode:
在今天的视图控制器的方法中调用您的扩展上下文,viewDidLoad
如下所示(Objective-C):
if ([self.extensionContext respondsToSelector:@selector(setWidgetLargestAvailableDisplayMode:)]) { // iOS 10+
[self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded];
} else {
self.preferredContentSize = CGSizeMake(0, 600.0); // iOS 10-
}
最好的方法当然是自动布局,但默认情况下,您可以像这样控制边距
func widgetMarginInsetsForProposedMarginInsets
(defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
return UIEdgeInsetsZero
}
显示 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 以获取有关应用程序扩展的更多更新
今天小部件默认 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;}