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

Ios 如何设置今日小部件扩展的高度?,ios,ios8,xcode6,ios-app-extension,Ios,Ios8,Xcode6,Ios App Extension,如何在通知中心更改应用程序的“今日”扩展的高度 我用界面生成器和代码进行了尝试, Interface Builder显示高度为600的视图,但未在设备上应用此高度 看起来我不能让它超过80像素 小部件的高度由系统调整。如果已使用约束定义了高度,将根据需要自动调整高度。如果您使用的是显式布局,您可以通过修改小部件的preferredContentSize请求新高度 请注意,您无法保证notification center会尊重您的身高要求:它可能会自动调整,也可能会调整,但不会调整到您想要的确切高

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

我用界面生成器和代码进行了尝试, Interface Builder显示高度为600的视图,但未在设备上应用此高度

看起来我不能让它超过80像素


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

请注意,您无法保证notification center会尊重您的身高要求:它可能会自动调整,也可能会调整,但不会调整到您想要的确切高度,或者可能根本不会遵守


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

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

将使您的小部件具有200的高度

请注意,宽度对视图没有影响,因为小部件必须适合自动处理的notification center的确切宽度

此外,如果要设置视图高度更改的动画,可以实现(Objective-C):

-(void)视图大小:(CGSize)大小
withTransitionCoordinator:(id)协调员
在视图控制器中使用

答案有点隐晦;您必须在文档侧栏中单击才能最终找到


另一种方法是使用约束视图的高度。

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

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

今天,小部件默认UIEdgeInsets defaultMarginInsets (UIEdgeInsets)defaultMarginInsets=(顶部=0,左侧=44,底部=39,右侧=0)

您应该添加此方法

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0);
return edgeInsets;}

因为iOS 10扩展的高度是110像素。您应该使用新的协议方法
widgetActiveDisplayModeDidChange:withMaximumSize:
扩展扩展大小(Objective-C):

此外,您可能需要在今天视图控制器的
viewDidLoad
方法中的扩展上下文上调用
setwidgetlagestavailabledisplaymode:
,如下所示(Objective-C):


此线程可能会有所帮助

有两种方式显示今日扩展:

  • 紧凑模式(小部件的固定高度)
  • 展开模式(小部件的可变高度)
  • 在紧凑模式下更改扩展高度的任何代码都不会产生任何差异。因此,您需要将模式从压缩模式更改为扩展模式

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

    +1以获取解释,并感谢您的回答!但不幸的是,自动布局在这种情况下对我不起作用:/如果您在自动布局中遇到问题,而没有更新扩展的高度,我会尝试1)使用Xcode中的新调试工具可视化约束(以确保您的约束正在做您认为它们正在做的事情),如果一切看起来都很好,2)归档错误,因为它应该“正常工作”。这是一个非常有用的答案。这解释了为什么我的小部件并不像我期望的那样有说服力。但是你在哪里读到的?我已经阅读了所有的Today extensions文档,我不记得读过系统可能会决定它是否应该是大的。它位于Notification Center框架的头文件中。如何在IB中设置自动布局的高度约束?我有我今天的VC和它的视图,但是我不能在视图上设置高度约束。视图有两个子视图,我已经设置了这些约束…这不是推荐的方法。如会话中所述,您应该使用自动布局。@Isiahturner谢谢。我还没有机会在线观看昨天的会议……preferredContentSize在横向模式下工作不好。看起来没有足够的空间放置小部件@SantaClaus能否与auto layout分享一些设置高度的代码?
    WidgetActiveDisplayModedChange
    仅适用于iOS 10及以上版本。请记住,iPad上的小部件大小(紧凑/扩展)不同。现在记不起确切的值,但它们比iPhone的小部件大小大。您还需要设置
    extensionContext?.widgetLargestAvailableDisplayMode=.expanded
    ,才能获得扩展模式。那么,如果我们想同时支持iOS10以下和iOS10以上,我们应该如何设置它呢?@Lion,它适合我,但我也想滚动我的小部件,因为我已经使用tableview来显示我的内容,并且我有一个数据列表要在小部件中显示。如果你有什么想法,可以帮我吗?
    - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0);
    return edgeInsets;}
    
    - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode
                             withMaximumSize:(CGSize)maxSize {
    
        if (activeDisplayMode == NCWidgetDisplayModeExpanded) {
            self.preferredContentSize = CGSizeMake(maxSize.width, 600.0);
        } else if (activeDisplayMode == NCWidgetDisplayModeCompact) {
            self.preferredContentSize = maxSize;
        }
    }
    
    if ([self.extensionContext respondsToSelector:@selector(setWidgetLargestAvailableDisplayMode:)]) { // iOS 10+
        [self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded];
    } else {
        self.preferredContentSize = CGSizeMake(0, 600.0); // iOS 10-
    }
    
    // 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);
      }
    }