为什么要对UIView.isHidden = false的动画调用进行复合处理?

时间:2018-10-01 21:09:58

标签: ios swift animation

如您所见,我在提出问题时遇到了麻烦。让我尝试解释一下:

我在我的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()
}

}

video

1 个答案:

答案 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。

希望它会有所帮助。祝你好运!