38

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

我使用 Interface Builder 和 Code 进行了尝试,Interface Builder 显示高度为 600 的视图,但它没有在设备上应用此高度。

看来我不能让它大于大约 80 像素...

在此处输入图像描述

4

6 回答 6

76

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

self.preferredContentSize = CGSizeMake(0, 200);

将使您的小部件的高度为 200。

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

此外,如果您想动画化视图高度的变化,您可以实现(Objective-C):

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

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

答案有点隐蔽;您必须在文档侧边栏中四处点击才能最终找到这个出色的文档


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

于 2014-06-04T16:01:56.203 回答
16

小部件的高度由系统调整。如果您使用约束定义了您的高度,这将根据需要自动调整。如果您使用显式布局,则可以通过修改preferredContentSize小部件的 来请求新高度。

请注意,您不能保证通知中心会尊重您的身高要求:它可能会自动调整,可能会调整但未调整到您想要的确切高度,或者根本不会得到尊重。

开发小部件的最佳方法是使用自动布局约束来设置您的高度值,这样您的小部件将轻松适应不同的高度。

于 2014-06-04T15:57:09.960 回答
15

由于 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

于 2016-10-29T19:40:16.280 回答
10

最好的方法当然是自动布局,但默认情况下,您可以像这样控制边距

func widgetMarginInsetsForProposedMarginInsets
    (defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
    return UIEdgeInsetsZero
}
于 2014-12-05T10:02:40.083 回答
8

显示 Today 扩展有两种方式:

  1. 紧凑模式(小部件的固定高度)
  2. 展开模式(小部件的可变高度)

在紧凑模式下更改扩展高度的任何代码都不会产生任何影响。因此,您需要将模式从紧凑模式更改为扩展模式。

// 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 以获取有关应用程序扩展的更多更新

于 2016-11-14T12:19:41.477 回答
1

今天小部件默认 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;}
于 2016-08-03T13:38:18.620 回答