UISearchBar 的宽度在嵌入 UINavigationBar 时不会改变

Posted

技术标签:

【中文标题】UISearchBar 的宽度在嵌入 UINavigationBar 时不会改变【英文标题】:UISearchBar width doesn't change when its embedded inside a UINavigationBar 【发布时间】:2014-11-03 20:37:11 【问题描述】:

我正在试验 ios 8 中引入的新 UISearchController API。虽然 API 是新的,但它使用相同的旧 UISearchBar。我将它添加到UINavigationControllertitleView

import UIKit

class ViewController: UIViewController, UISearchBarDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()

        let searchController = UISearchController(searchResultsController: nil)
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.dimsBackgroundDuringPresentation = false
        searchController.searchBar.delegate = self
        navigationItem.titleView = searchController.searchBar
    

我不需要搜索栏占据导航栏的整个宽度。问题是我无法调整它的大小。首先我尝试设置搜索栏的框架。

searchController.searchBar.frame = CGRect(x: 0, y: 0, width: 100, height: 44)

这不起作用,所以我尝试设置 titleView 的框架。

navigationItem.titleView!.frame = CGRect(x: 0, y: 0, width: 100, height: 44)

它们都不起作用。

有人知道另一种方法吗?

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用另一个视图作为导航栏标题并在其中放置搜索栏。如果出现 bar tint color 问题,可以通过设置 backgroundImage 属性来解决。这应该有效:

let searchController = UISearchController(searchResultsController: nil)
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.delegate = self

let frame = CGRect(x: 0, y: 0, width: 100, height: 44)
let titleView = UIView(frame: frame)
searchController.searchBar.backgroundImage = UIImage()
searchController.searchBar.frame = frame
titleView.addSubview(searchController.searchBar)
navigationItem.titleView = titleView

【讨论】:

效果很好!谢谢。 工作完美。谢谢!

以上是关于UISearchBar 的宽度在嵌入 UINavigationBar 时不会改变的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar 宽度动画和 AutoLayout

UINavigationBar 中的 UISearchBar 在旋转方向时改变宽度

修改 UITableView 标头中的 UISearchBar 宽度

动画 UISearchBar 框架的宽度

UISearchBar 横向宽度错误

嵌入 UISplitViewController 时,UINavigationBar 中缺少 iOS11 UISearchBar