UISearchController searchBar 框架仅在第一次点击时调整大小

UISearchController searchBar frame only resizes on first click

我刚刚在常规 UIViewController 中实现了 UISearchController,但我遇到了一个奇怪的问题。

我有一个 UIView,它完全适合我希望 UISearchBar 采用的大小。首次启动视图时,我将 UISearchBar 作为子视图添加到此 UIView。 但是当我启动它时,UISearchBar 不采用其父 UIView 的大小——它只采用整个屏幕的宽度。

如您所见,它与右侧的按钮重叠。

但是一旦我点击搜索栏并取消它,它就会调整到我想要的大小。

这可能是什么问题?我尝试将 SearchBar 中的 AutoLayout Constraints 添加到其父视图,但它似乎没有任何改变。 [UIView addSubview:] 不处理这个吗?

UISearchController 的视图行为确实很奇怪,但有一个简单的解决方法。

  • 使用额外的容器视图
  • 将 UISearchController 的视图放在里面
  • 将 UISearchController 的视图自动调整掩码设置为 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
  • 将 UISearchController 的框架设置为容器的视图边界

此时 UISearchController.view 不会调整超过 container.bounds。

对我来说这行不通,但我找到了一个我想分享的解决方案:

不是把searchBar放在一个containerView里,而是在containerView里放一个navigationBar,然后把searchBar放在这个navigationBar里。对我来说,此时问题仍然存在。

但是后来我把一个1像素宽的view作为navigationItem放到了navigationBar的右边。从那时起一切正常,搜索栏的文本字段在第一次选择后不再拉伸。

它更像是一种 hack,而不是解决烦人错误的好方法(?),但对我来说,这种 hack 是可以接受的,因为我已经需要在 searchBar 的两侧留出一些边距。这是一些代码:

//初始化或viewDidLoad

navigationBar = UINavigationBar(frame: .zero)

let navigationItem = UINavigationItem()
navigationItem.titleView = searchController.searchBar

let leftView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: Design.margin, height: 1))
leftView.backgroundColor = .clear
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: leftView)

let rightView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: Design.margin, height: 1))
rightView.backgroundColor = .clear
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightView)


navigationBar.items = [navigationItem]

containerView.addSubview(navigationBar)

// 在布局中设置框架尺寸