iOS 8今天扩展的最大高度



我正在研究一个具有动态大小表的Today扩展。我已经能够让表调整内容的大小使用:

    self.preferredContentSize = accountsTable.contentSize

然而,我发现它不会比一定的大小(568像素)高,即使我可以告诉表的contentSize更大。

我不清楚这是否是一个内置限制,或者是否有一种方法可以使这个视图更大。似乎以前的一些扩展(股票小部件)能够变得更大。

任何人遇到同样的行为。有人知道是否有可能使扩展出现更大要么立即或使用"显示全部"按钮像股票小部件?

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

为iPhone:

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

:

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

好的,虽然你可以给preferredContentSize分配任何CGSize,但它的高度和宽度都减少到最大值。

取向( max宽度, max高度):

iPhone 5 s

肖像( 272 , 441.5 )
iPhone 5 s 景观( 520 , 205.5 )

iPhone 6

肖像( 327 , 540.5 )
iPhone 6 景观( 586 , 260.5 )

iPhone 6 +

肖像( 362 , 610 )
iPhone 6 + 景观( 585 , 288 )

iPad迷你

肖像( 535 , 853 )
迷你iPad 景观( 535 , 597 )

iPad

肖像( 711 , 985 )
iPad 景观( 967 , 729 )

我是如何得到这些值的?

@IBOutlet weak var sizerView: UIView!

inside 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
}

看来,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);
}

要获得小部件活动显示模式的最大高度,请在您的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
}

建议使用自动布局约束来约束视图的高度。

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

最新更新