iOS 8 今日扩展的最大高度是多少?

31

我正在开发一个动态大小表格的今日小组件。我已经能够使用以下方法调整表格大小以适应内容:

    self.preferredContentSize = accountsTable.contentSize

然而,我发现即使表格的contentSize更大,它也不会变得比一定大小(568像素)更高。

我不确定这是否是一个内置限制,或者是否有办法绕过这个限制来制作一个更大的视图。似乎一些之前的扩展(例如股票小部件)可以变得更大。

有没有人遇到相同的情况?有没有人知道如何立刻或使用"Show All"按钮使扩展程序变得更大,就像股票小部件一样?


1
同样的问题。更糟糕的是,它报告568像素作为高度,即使我可以在屏幕上渲染的视图要小得多,这使得动态布局非常困难。 - Rick
5个回答

15

我做了一些测试,你可以使用这个公式来计算你的今日小组件的最大高度:

对于iPhone:

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

适用于iPad:

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

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


1
我的测试似乎与这一点相符。谢谢! - Stephen
实际上,这只适用于iPhone。iPad似乎不同。 - Stephen
1
你假设底部边距为10。例如,对于iPhone 6横向模式下的可用高度为375(750像素)。因此,我们需要减去以下高度:今天/通知分段控制栏的高度(53),应用程序扩展部分标题的高度(32),底部箭头栏的高度(31)和底部边距的高度(10)= 126。 - Gamma-Point
我不会再使用这种方法,请查看我的答案。 - MobileMon

6

虽然您可以向preferredContentSize分配任何CGSize,但它会被缩小到最大高度和宽度。

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

iPhone 5S 竖屏模式 (272, 441.5)
iPhone 5S 横屏模式 (520, 205.5)

iPhone 6 竖屏模式 (327, 540.5)
iPhone 6 横屏模式 (586, 260.5)

iPhone 6 Plus 竖屏模式 (362, 610)
iPhone 6 Plus 横屏模式 (585, 288)

iPad Mini 竖屏模式 (535, 853)
iPad Mini 横屏模式 (535, 597)

iPad 竖屏模式 (711, 985)
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
}

你救了我的命!我一直在为修复小部件的高度而苦恼。该死的苹果! - sdtaheri

4
似乎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);
}

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
}

-3

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

看起来568像素只是您的iPhone 5的最大高度,而不是实际大小。据我所知,没有办法获取真实大小。


1
自动布局无法解决需要显示“显示全部”按钮的情况。 - Andriy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接