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

时间:2014-06-04 12:56:23

标签: ios ios8 xcode6 ios-app-extension

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

我尝试使用Interface Builder和Code, 界面生成器显示高度为600的视图,但它不在设备上应用此高度。

似乎我无法让它大于80像素......

enter image description here

6 个答案:

答案 0 :(得分:76)

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

self.preferredContentSize = CGSizeMake(0, 200);

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

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

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

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
使用-animateAlongsideTransition:completion:

在视图控制器中

答案有点隐藏;您必须在文档侧栏中单击以最终找到this fantastic document


另一种方法是使用auto-layout constraints来限制视图的高度。

答案 1 :(得分:16)

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

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

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

答案 2 :(得分: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

答案 3 :(得分:10)

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

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

答案 4 :(得分:8)

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

  1. 紧凑模式(Widget固定高度)
  2. 展开模式(Widget的可变高度)
  3. 无论您在紧凑模式下更改扩展高度所做的任何代码都不会产生任何影响。因此,您需要将模式从紧凑模式更改为扩展模式。

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

答案 5 :(得分:1)

今天小部件默认UIEdgeInsets defaultMarginInsets (UIEdgeInsets)defaultMarginInsets =(top = 0,left = 44,bottom = 39,right = 0)

您应该添加此方法

item_id