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

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

问题描述:

我有一个NavigationVC,我在我的应用程序和共享扩展中都显示了该图像,其中只包含搜索视图和表格视图。在我的应用中,它看起来是正确的,但在我的共享扩展中,搜索视图出现20像素太高,并被导航栏遮挡。这样做没有意义,因为打印出表格视图的框架,搜索视图以及表格视图的内容插图时,它们的外观之间不应该存在差异。下面是运行应用程序时的截图:在股延长运行时在iOS共享扩展中未正确布局的视图

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个像素可能与状态栏框架(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像素的差别,但不影响外观表视图 - 仍然按预期显示。这对我来说没有意义,为什么搜索栏会处于与它不同的相对位置。

实测值的溶液:未确定

状态栏框直到viewDidAppear被调用后,但viewWillLayoutSubviews没有在这一点上调用。所以在viewDidAppear中调用setNeedsLayout修复了它。

至于为什么它不利地影响searchView而不是tableView的布局,我不知道,因为它们都是普通UIViewController的附加属性。