如您所见,我在提出问题时遇到了麻烦。让我尝试解释一下:
我在我的Swift ios应用中使用了搜索栏。为了获得所需的动画效果,我将其放在垂直堆栈视图中,然后为其isHidden
属性设置动画。通过这种方式,搜索栏在动画显示时向下推堆栈视图的其他子级,或者在动画显示时向下推堆栈视图的其他子级。到目前为止,一切都很好。
我注意到一种我认为很奇怪的行为。可能是错误,或者是我不了解事物的工作方式。基本上,如果我连续调用搜索栏隐藏方法x次,那么我需要先调用显示方法x次的搜索栏,然后才能显示该方法。无论我调用隐藏方法多少次,我都希望只打一个电话就可以显示搜索栏。这个问题并不存在:如果我搜索显示代码x次的搜索栏,我只需要调用一次隐藏方法就可以了。如果我没有设置动画就设置isHidden
,就不会发生这种情况...
这是示例代码和有关此问题的视频。如果有人能帮助我了解这种行为,我将不胜感激。
class ViewController: UIViewController {
@IBOutlet weak var searchBar: UISearchBar! {
didSet {
searchBar.isHidden = true
}
}
@IBAction func showAction(_ sender: UIButton) {
expandSearch()
}
@IBAction func hideAction(_ sender: UIButton) {
collapseSearch()
}
private func expandSearch() {
UIView.animate(withDuration: 0.3){
self.searchBar.isHidden = false
}
}
private func collapseSearch() {
UIView.animate(withDuration: 0.3){
self.searchBar.isHidden = true
}
searchBar.resignFirstResponder()
}
}
答案 0 :(得分:0)
您不应调用x搜索栏的异步动画,而建议您将其状态保持在可变状态,例如isSearchBarHidden, 并在显示/隐藏搜索栏之前进行检查。您可以只使用一种带有签名showSearchBar(show:Bool)的方法,并在那里设置此变量。
@IBAction func showAction(_ sender: UIButton) {
showSearchBar(true)
}
@IBAction func hideAction(_ sender: UIButton) {
showSearchBar(false)
}
private
func showSearchBar(_ show: Bool) {
guard isSearchBarHidden != show else {
return
}
UIView.animate(withDuration: 0.3, animations: {
self.searchBar.isHidden = show
}) {
self.isSearchBarHidden = show
if !show && searchBar.isFerstResponder {
searchBar.resignFirstResponder
}
}
}
private
var isSearchBarHidden: Bool = true
同样好的方法是在调用resignFirstResponder之前检查textView / textField / searchBar是否为FirstResponder。
希望它会有所帮助。祝你好运!