如何设置今日窗口小部件扩展的高度?

Got*_*chi 38 ios xcode6 ios8 ios-app-extension

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

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

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

在此输入图像描述

San*_*aus 76

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

self.preferredContentSize = CGSizeMake(0, 200);
Run Code Online (Sandbox Code Playgroud)

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

请注意,宽度对视图没有影响,因为窗口小部件必须符合通知中心的确切宽度,这是自动处理的.

此外,如果要对视图高度的更改进行动画处理,可以实现(Objective-C):

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
Run Code Online (Sandbox Code Playgroud)

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

答案有点隐藏; 您必须在文档侧栏中单击以最终找到这个奇妙的文档.


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

  • 这不是推荐的方法.如会话中所述,您应该使用自动布局. (2认同)

lxt*_*lxt 16

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

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

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


Lio*_*ion 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,您可能需要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-
}
Run Code Online (Sandbox Code Playgroud)

这个主题可能会有所帮助https://forums.developer.apple.com/thread/48930


小智 10

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

func widgetMarginInsetsForProposedMarginInsets
    (defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
    return UIEdgeInsetsZero
}
Run Code Online (Sandbox Code Playgroud)


fAi*_*SaL 8

有两种方式可以显示今天的扩展:

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

无论您在紧凑模式下更改扩展高度所做的代码都没有任何区别.因此,您需要将模式从紧凑模式更改为扩展模式.

// 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以参考WWDC以获取有关App扩展的更多更新