UISearchController searchBar frame only resizes on first click

一曲冷凌霜 提交于 2019-11-29 15:34:37

UISearchController's view behaviour is weird indeed, but there is a simple workaround.

  • Use an additional container view
  • put UISearchController's view inside
  • set UISearchController's view autoresizing mask to UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
  • set UISearchController's frame to container's view bounds

At this point UISearchController.view won't resize beyond container.bounds.

For me this didn't work, but I found a solution that I would like to share:

Instead of putting the searchBar in a containerView, put a navigationBar in the containerView, and put the searchBar in this navigationBar. For me, the problem still exists at this point.

But then I put a 1-pixel wide view as a navigationItem to the right of the navigationBar. From then it works all fine, the textfield of the searchBar didn't stretch anymore after the first selection.

It is more of a hack instead of a good solution to an annoying bug(?), but for me this hack is acceptable as I already needed some margins on both side of the searchBar. Here is some code:

//on init or 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)

// setup frame sizes in your layout

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!