在搜索栏上键入会破坏布局

Posted

技术标签:

【中文标题】在搜索栏上键入会破坏布局【英文标题】:Typing on search bar breaks layout 【发布时间】:2018-09-10 09:10:22 【问题描述】:

我有一个tableView:

tableView = UITableView()
view.addSubview(tableView)

tableView.translatesAutoresizingMaskIntoConstraints = false
let constraints = [tableView.topAnchor.constraint(equalTo: view.topAnchor), tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor), tableView.heightAnchor.constraint(equalToConstant: view.frame.height * 0.6)]
NSLayoutConstraint.activate(constraints)

我的 searchController 看起来像:

func setupSearchController() 
    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search for a candy"
    navigationItem.searchController = searchController
    definesPresentationContext = true

当它第一次加载时,一切都很好。但是当我点击搜索栏在那里输入时,我的搜索栏移动到顶部,导航栏变小并且它破坏了我的布局,并且 tableView 和 searchBar 之间出现了空白:

当导航栏大小发生变化时,如何改进我的约束以在 tableView 上上下移动?

【问题讨论】:

【参考方案1】:

您必须更改 tableview 的顶部约束。 尝试替换这 2 个约束

tableView.topAnchor.constraint(equalTo: searchController.searchBar.bottomAnchor), 
tableView.topAnchor.constraint(equalTo: view.topAnchor)

有了这个

tableView.topAnchor.constraint(equalTo: view.topAnchor)

自动内容插入调整将完成剩下的工作。

还要注意,在您的表格视图约束列表中,您没有前导/水平位置约束。我建议也添加这个约束

tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor)

【讨论】:

对不起,打错了!我忘了从问题中删除 searchBar 锚。我已经更新了我的问题,但问题就在那里。而且我有前导和尾随约束。请将代码向右滚动 对不起。这是我的错!请再看看我的问题。提前致谢! 抱歉,我无法重现您的问题,由于您的限制,当点击搜索栏时,tableview 内容会向上移动。请在此处或 GitHub 上发布可验证的示例。

以上是关于在搜索栏上键入会破坏布局的主要内容,如果未能解决你的问题,请参考以下文章

解散 UIImagePickerController 会破坏父布局

UITabbarController 隐藏标签栏破坏了安全区域布局

QLabel 破坏了布局的中心对齐

在 iOS 7 上,在 viewDidLoad 中设置图层变换会破坏自动布局

scrollToItemAtIndexPath 破坏 UICollectionViewCell 布局

谷歌浏览器工具栏破坏网站布局