如何设置今天的Widget扩展的高度?

如何在通知中心更改应用程序的今日扩展程序的高度?

我用界面生成器和代码尝试了它,界面生成器显示高度为600的视图,但是它没有在设备上应用这个高度。

看来我不能比80像素更大

在这里输入图像说明

在你的小部件UIViewController.m (Objective-C)中:

 self.preferredContentSize = CGSizeMake(0, 200); 

将使你的部件有200的高度。

请注意,宽度将不会影响视图,因为窗口小部件必须适合自动处理的通知中心的确切宽度。

另外,如果你想animation视图高度的变化,你可以实现(Objective-C):

 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 

在你的视图控制器中使用animateAlongsideTransition:completion:

答案有点隐藏, 你不得不在文档边栏中点击以最终find这个奇妙的文档 。


另一种方法是使用自动布局约束来约束视图的高度。

小部件的高度由系统调整。 如果您已经使用约束来定义高度,则会根据需要自动调整。 如果您使用显式布局,则可以通过修改widget的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- } 

这个线程可能会有帮助https://forums.developer.apple.com/thread/48930

最好的方法当然是Autolayout,但是默认情况下有这样的边距可以控制

 func widgetMarginInsetsForProposedMarginInsets (defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) { return UIEdgeInsetsZero } 

有两种方法可以显示今天的延伸:

  1. 紧凑模式(Widget固定高度)
  2. 展开模式(可变高度的小工具)

无论您在Compact模式下更改扩展高度的代码都不会有任何区别。 所以您需要将模式从紧凑模式更改为展开模式。

 // 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;}