【问题标题】:Views not laying out correctly in iOS share extensioniOS 共享扩展中的视图布局不正确
【发布时间】:2016-11-27 13:14:18
【问题描述】:

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

以及在共享扩展中运行时的截图:

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

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 像素可能与共享扩展中未提供状态栏框架(通常但不总是高 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 像素差异,但这不会影响表格视图的外观 - 仍然按预期显示。为什么搜索栏与它处于不同的相对位置对我来说没有意义。

【问题讨论】:

    标签: ios swift ios8-share-extension layoutsubviews


    【解决方案1】:

    找到解决办法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多