【问题标题】:How to set the height of a Today Widget Extension?如何设置今日小部件扩展的高度?
【发布时间】:2014-07-25 03:24:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios ios8 xcode6 ios-app-extension


    【解决方案1】:

    在您的小部件UIViewController.m(Objective-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 来限制视图的高度。

    【讨论】:

    • 这不是推荐的方法。如会议所述,您应该使用自动布局。
    • @IsaiahTurner 谢谢。我还没有机会在线观看昨天的课程...
    • preferredContentSize 在横向模式下无法正常工作。看起来小部件没有足够的空间。 @SantaClaus 您能否分享一些使用自动布局设置高度的代码?
    【解决方案2】:

    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 了解更多关于应用扩展的更新

    【讨论】:

    • widgetActiveDisplayModeDidChange 仅适用于 iOS 10 及更高版本。
    【解决方案3】:

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

    此外,您可能需要在今天的视图控制器的 viewDidLoad 方法中调用您的扩展上下文中的 setWidgetLargestAvailableDisplayMode:,如下所示(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

    【讨论】:

    • 请记住,iPad 上的小部件尺寸(紧凑/扩展)是不同的。目前不记得确切的值,但它们比 iPhone 的小部件尺寸大。
    • 您还需要设置extensionContext?.widgetLargestAvailableDisplayMode = .expanded才能获得展开模式。
    • 那么如果我们想同时支持iOS10以下和以上,我们应该如何设置呢?
    • @Lion,它适用于我但我也想滚动我的小部件,因为我已经使用 tableview 来显示我的内容,并且我有要在小部件中显示的数据列表。如果有任何想法,请帮助我吗?
    【解决方案4】:

    今日小部件默认 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;}
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • +1 的解释,感谢您的回答!但不幸的是,在这种情况下,自动布局对我不起作用:/
        • 如果您在自动布局不更新扩展高度时遇到问题,我会尝试 1) 使用 Xcode 中的新调试工具可视化约束(以确保您的约束正在执行你认为他们在做),如果一切看起来都很好,2)提交一个错误,因为它应该“正常工作”。
        • 这是一个非常有用的答案。它解释了为什么我的小部件并不总是像我期望的那样清晰。但是你在哪里读到这个?我已经阅读了所有 Today 扩展文档,但我不记得阅读过系统可能会决定它是否应该很大。
        • 它在通知中心框架的头文件中。
        • 如何在 IB 中设置自动布局的高度约束?我有我的 Today VC 和它的视图,但我无法在视图上设置高度限制。该视图有两个子视图,我已经设置了这些约束...
        猜你喜欢
        • 2017-03-31
        • 2014-10-15
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-23
        • 2015-05-03
        • 2021-01-14
        相关资源
        最近更新 更多