在iOS共享扩展中未正确布局的视图

时间:2016-11-27 13:14:18

标签: ios swift ios8-share-extension layoutsubviews

我有一个NavigationVC,我在我的应用程序和共享扩展中显示,其中只包括搜索视图和表格视图。在我的应用程序中,它显示正确,但在我的共享扩展程序中,搜索视图显示20像素太高,并被导航栏遮挡。这没有意义,因为打印出表格视图的框架,搜索视图和表格视图的内容插入,它们的外观之间不应该存在差异。这是运行应用程序时的屏幕截图:

enter image description here

在共享扩展程序中运行时的屏幕截图:

enter image description here

这是我的初始化/布局代码:

override open func viewDidLoad() {
    super.viewDidLoad()
    self.view.addSubview(self.tableView)
    self.view.addSubview(self.searchView)
}

override open func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    self.tableView.frame = self.view.bounds

    var tableViewContentInsetTop: CGFloat

    if let navigationBar = self.navigationController?.navigationBar {
        tableViewContentInsetTop = navigationBar.frame.origin.y + navigationBar.frame.size.height
    } else {
        tableViewContentInsetTop = 0
    }

    self.searchView.frame = CGRect(
        x: 0,
        y: self.tableView.frame.origin.y + tableViewContentInsetTop,
        width: self.tableView.frame.size.width,
        height: NewConversationViewController.searchViewHeight())

    tableViewContentInsetTop += self.searchView.bounds.size.height

    self.tableView.contentInset.top = tableViewContentInsetTop
}

相当简单 - 它们都被添加到同一个视图中。计算出导航栏底部的y坐标,并在那里放置搜索视图。然后表格视图除了“高度”之外还有搜索栏y的内容插入。你期望的结果是他们能够保持一致。实际发生的是tableview正确显示,内容插入正确,但搜索栏显示的像素太高了。

20个像素可能涉及在共享扩展上没有给出状态栏帧(通常但不总是20个像素高)的事实。我在两种情况下都打印了一些日志。

应用:

table view frame: (0.0, 0.0, 375.0, 667.0)
search view frame: (0.0, 64.0, 375.0, 40.0)
navigation bar bounds: (0.0, 0.0, 375.0, 44.0)
navigation bar frame: (0.0, 20.0, 375.0, 44.0)
navigation controller frame: (0.0, 0.0, 375.0, 667.0)
status bar frame: (0.0, 0.0, 375.0, 20.0)
application bounds: (0.0, 0.0, 375.0, 667.0)
table view content inset: 104.0

分享扩展程序:

table view frame: (0.0, 0.0, 375.0, 667.0)
search view frame: (0.0, 44.0, 375.0, 40.0)
navigation bar bounds: (0.0, 0.0, 375.0, 44.0)
navigation bar frame: (0.0, 0.0, 375.0, 44.0)
navigation controller frame: (0.0, 0.0, 375.0, 667.0)
status bar frame: (0.0, 0.0, 0.0, 0.0)
application bounds: (0.0, 0.0, 375.0, 667.0)
table view content inset: 84.0

您可以看到状态栏框架导致的20像素差异未被考虑,但这不会影响表格视图的外观 - 仍然按预期显示。对我来说,为什么搜索栏与它的位置不同是没有意义的。

1 个答案:

答案 0 :(得分:1)

找到解决方案:

在调用viewDidAppear之后,状态栏框架才会确定,但此时不会调用viewWillLayoutSubviews。因此,在setNeedsLayout中调用viewDidAppear会修复它。

至于为什么它会对searchView但不是tableView的布局产生负面影响,我不知道,因为它们都是常规UIViewController上的附加属性。