保留UISearchBar的边距

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保留UISearchBar的边距相关的知识,希望对你有一定的参考价值。

我正在尝试创建UISearchController并将其搜索栏放入容器视图中。 searchView是出口。这是我的代码:

    let searchController = UISearchController(searchResultsController: nil)
    self.searchController = searchController

    let searchBarBackground = UIImage.roundedImage(UIImage.image(with: #colorLiteral(red: 0.5568627451, green: 0.5568627451, blue: 0.5764705882, alpha: 0.2), size: size), cornerRadius: cornerRadius)
    searchController.searchBar.setSearchFieldBackgroundImage(searchBarBackground, for: .normal)
    searchController.searchBar.searchTextPositionAdjustment = UIOffsetMake(8.0, 0.0)
    searchController.searchBar.searchBarStyle = .minimal
    searchController.searchBar.barStyle = .black
    searchController.searchBar.delegate = self

    searchView.addSubview(searchController.searchBar)

我无法弄清楚如何使搜索栏保留主视图中的边距。当我尝试向容器视图添加约束并将搜索栏添加为子视图时,搜索栏不会考虑尾随约束。

enter image description here

即使手动设置搜索栏框架等于viewDidLayoutSubviews中的内容视图边界也无济于事。只有当我将前导和尾随约束设置为0而不考虑超视图边距时,它才会显示正常。但它只有8pt的边缘,我需要更多。

enter image description here

我怎样才能实现它?也许可以更改搜索栏的默认边距?谢谢。

如果需要,可以使用IB的屏幕截图(仅限于使用值-8来限制搜索栏内部边距的边距):

enter image description here

答案

我最终得到了以下解决方案:在每次呈现和解散搜索控制器之后更新搜索栏框架,并在viewDidAppear(_:)中进行初始设置。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController?.searchBar.frame.size.width = searchView.bounds.width
}

func didPresentSearchController(_ searchController: UISearchController) {
    searchController.searchBar.frame.size.width = self.searchView.bounds.width
}

func didDismissSearchController(_ searchController: UISearchController) {
    searchController.searchBar.frame.size.width = self.searchView.bounds.width
}
另一答案

问题是您以编程方式创建视图并使用自动调整掩码。

https://developer.apple.com/documentation/uikit/uiview/1622572-translatesautoresizingmaskintoco

默认情况下,对于以编程方式创建的任何视图,该属性都设置为true。

简单UISearchBar的示例:

class ViewController: UIViewController, UISearchBarDelegate {

    weak var searchBar: UISearchBar?

    override func viewDidLoad() {
        super.viewDidLoad()

        let searchBar = UISearchBar(frame: .zero)
        self.searchBar = searchBar
        searchBar.searchBarStyle = .minimal
        searchBar.barStyle = .black
        searchBar.delegate = self
        searchBar.translatesAutoresizingMaskIntoConstraints = false

        view.addSubview(searchBar)
        NSLayoutConstraint.activate([
            searchBar.topAnchor.constraint(equalTo: view.topAnchor, constant: 50.0),
            searchBar.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 40.0),
            view.trailingAnchor.constraint(equalTo: searchBar.trailingAnchor, constant: 40.0),
        searchBar.heightAnchor.constraint(equalToConstant: 36.0)
            ])
    }
}

以上是关于保留UISearchBar的边距的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在 RealtiveLayout 中设置 LinearLayout 的边距 - 不起作用

UISearchBar 自定义

在代码中设置 textview 的边距和重力不起作用

android中编辑文本内的边距

使用 cowplot 时减少绘图之间的边距

如何在 IE 中设置对象的边距?