UISearchController searchBar 框架仅在第一次点击时调整大小
Posted
技术标签:
【中文标题】UISearchController searchBar 框架仅在第一次点击时调整大小【英文标题】:UISearchController searchBar frame only resizes on first click 【发布时间】:2017-04-07 12:36:06 【问题描述】:我刚刚在常规 UIViewController 中实现了一个 UISearchController,我遇到了一个奇怪的问题。
我有一个 UIView,它完全适合我希望 UISearchBar 采用的大小。在第一次启动视图时,我将 UISearchBar 作为 SubView 添加到此 UIView。 但是当我启动它时, UISearchBar 不会占用其父 UIView 的大小——它只占用整个屏幕的宽度。
如您所见,它与右侧的按钮重叠。
但是一旦我点击搜索栏并取消它,它就会调整到我想要的确切大小。
这可能是什么问题?我尝试将 SearchBar 中的 AutoLayout Constraints 添加到其父视图,但它似乎没有改变任何东西。 [UIView addSubview:] 不处理这个吗?
【问题讨论】:
【参考方案1】:UISearchController 的视图行为确实很奇怪,但有一个简单的解决方法。
使用额外的容器视图 把 UISearchController 的视图放进去 将 UISearchController 的视图自动调整掩码设置为 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight 将 UISearchController 的框架设置为容器的视图边界此时 UISearchController.view 的大小不会超出 container.bounds。
【讨论】:
感谢您的留言!我不太明白——这就是我现在正在做的事情,对吧?我已经将 SearchBar 添加到我的容器中! 如果我现在理解正确,您的容器是最顶层视图控制器(又名 visibleVC.view)的视图,其中添加了 uiseachcontroller.view 作为它的子视图。我建议添加额外的容器视图(屏幕的宽度约为 80%,高度等于 uiseachcontroller.view)作为 visibleVC.view 的子视图。然后将 uisearchcontroller 视图添加到这个新创建的容器视图中。 我已经有一个容器视图,它具有第二张图片中 UISearchBar 的确切大小——这就是我添加 UISearchController 的 UIView。这就是为什么我不明白它 - 我点击一次后它可以工作,但在第一次启动时它不起作用。 您是否尝试过将自动调整大小的遮罩灵活宽度和灵活高度应用到 uisearchcontroller.view 并将其框架设置为容器视图边界? 'searchController.searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; searchController.searchBar.frame = searchBarView.bounds;'令人惊讶的是,它完美地工作。非常感谢。请将其发布为答案,我会接受!【参考方案2】:对我来说这不起作用,但我找到了一个我想分享的解决方案:
不是将searchBar放在containerView中,而是将navigationBar放在containerView中,将searchBar放在这个navigationBar中。对我来说,这个问题仍然存在。
然后我将一个 1 像素宽的视图作为导航项放在导航栏的右侧。从那时起一切正常,第一次选择后,searchBar 的文本字段不再拉伸。
这更像是一种 hack,而不是一个解决烦人 bug 的好方法(?),但对我来说,这种 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)
// 在布局中设置帧大小
【讨论】:
以上是关于UISearchController searchBar 框架仅在第一次点击时调整大小的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableView Objective-C 中实现 UISearchController
在 UISearchController 中按取消后导航栏被阻止