【问题标题】:Maximum height of iOS 8 Today Extension?iOS 8 Today Extension 的最大高度?
【发布时间】:2014-09-09 01:23:09
【问题描述】:

我正在开发带有动态大小表格的 Today Extension。我已经能够让表格调整内容的大小:

    self.preferredContentSize = accountsTable.contentSize

但是,我发现它不会比特定大小(568 像素)高,即使我可以告诉表格 contentSize 更大。

我不清楚这是一个内置的限制,还是有办法解决这个问题来获得更大的视野。似乎以前的一些扩展(股票小部件)能够变得更大。

遇到相同行为的其他人。任何人都知道是否可以立即或使用“显示全部”按钮(如 Stock 小部件)使扩展看起来更大?

【问题讨论】:

  • 这里也一样。更糟糕的是,它报告的高度为 568 像素,即使我被允许在屏幕上渲染的视图要少得多,这使得动态布局很痛苦。

标签: ios xcode swift ios8 today-extension


【解决方案1】:

要获得小部件活动显示模式的最大高度,请在 UIViewController 中执行此操作:

let context = self.extensionContext
if let context = context{
    let height = context.widgetMaximumSize(for: context.widgetActiveDisplayMode).height
}

无论当前显示模式如何,要分别获得展开和紧凑的最大高度,请执行以下操作:

var context = self.extensionContext
if let context = context{
    let compactHeight = context.widgetMaximumSize(for: .compact).height
    let expandedHeight = context.widgetMaximumSize(for: .expanded).height
}

【讨论】:

    【解决方案2】:

    看来,iOS 正在为您自己的约束添加 UIView-Encapsulated-Layout-Height 约束:

    (
        "<NSLayoutConstraint:0x610000280640 V:[_UILayoutGuide:0x7f92d0513810]-(500)-[UILabel:0x7f92d040cb20'Hello World']>",
        "<NSLayoutConstraint:0x610000280690 V:[UILabel:0x7f92d040cb20'Hello World']-(500)-[_UILayoutGuide:0x7f92d0515100]>",
        "<_UILayoutSupportConstraint:0x6100002a2f40 V:[_UILayoutGuide:0x7f92d0513810(0)]>",
        "<_UILayoutSupportConstraint:0x6100002a2ee0 V:|-(0)-[_UILayoutGuide:0x7f92d0513810]   (Names: '|':UIView:0x7f92d040c810 )>",
        "<_UILayoutSupportConstraint:0x6100002a3000 V:[_UILayoutGuide:0x7f92d0515100(0)]>",
        "<_UILayoutSupportConstraint:0x6100002a2fa0 _UILayoutGuide:0x7f92d0515100.bottom == UIView:0x7f92d040c810.bottom>",
        "<NSLayoutConstraint:0x60800009e780 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7f92d040c810(628)]>"
    )
    

    此约束强制小部件具有最大高度。你可以像这样得到它的价值:

    - (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
    
        for (NSLayoutConstraint *constraint in self.view.constraints) {
            if ([constraint.identifier isEqualToString:@"UIView-Encapsulated-Layout-Height"]) {
                NSLog(@"Height: %@", @(constraint.constant));
            }
        }
    
        completionHandler(NCUpdateResultNewData);
    }
    

    【讨论】:

      【解决方案3】:

      好的,尽管您可以将任何CGSize 分配给preferredContentSize,但它会减小到最大高度和宽度。

      设备方向(最大宽度最大高度):

      iPhone 5S 纵向(272441.5
      iPhone 5S 横向(520 , 205.5)

      iPhone 6 纵向(327540.5
      iPhone 6 横向(586 , 260.5)

      iPhone 6 Plus 纵向(362610
      iPhone 6 Plus 横向(585, 288)

      iPad Mini 纵向(535853
      iPad Mini 横向(535 , 597)

      iPad 纵向(711985
      iPad 横向(967强>, 729)

      我是如何获得这些值的?

      @IBOutlet weak var sizerView: UIView!
      

      viewDidLoad:里面

      preferredContentSize = CGSizeMake(0, 2000)
      dispatch_after(1, dispatch_get_main_queue(), { //it needs time to render itself
          label.text = NSStringFromCGSize(self.sizerView.bounds.size) //here you have MAX VALUES
      }
      

      【讨论】:

      • 你救了我的命!我正在努力修复小部件的高度。该死的苹果!
      【解决方案4】:

      我做了一些测试,你可以用这个公式计算你的 Today Extension 的最大高度:

      对于 iPhone:

      float maxHeight = [[ UIScreen mainScreen ] bounds ].size.height - 126;
      

      iPad:

      float maxHeight = [[ UIScreen mainScreen ] bounds ].size.height - 171;
      

      这应该适用于所有屏幕尺寸...

      【讨论】:

      • 我的测试似乎同意这一点。谢谢!
      • 实际上,仅适用于 iPhone。 iPad 似乎不一样了
      • 您假设下边距为 10。例如,iPhone 6 在横向模式下,可用高度为 375(750 像素)。所以我们需要减去以下的高度:今天/通知分段控制栏的高度(53),应用扩展部分标题(32),底部箭头栏(31)和底部边距(10)= 126。 /跨度>
      • 以后我不会再用这个方法了,请看我的回答
      【解决方案5】:

      推荐的方法是使用自动布局约束来约束视图的高度。

      似乎 568px 只是 iPhone 5 的最大高度,而不是实际尺寸。据我所知,没有办法获得真正的尺寸。

      【讨论】:

      • 当您需要显示“显示全部”按钮之类的内容时,自动布局无法解决问题。
      猜你喜欢
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多