Почему составляются анимированные вызовы UIView.isHidden = false? - PullRequest
0 голосов
/ 02 октября 2018

Как видите, у меня проблемы с формулировкой вопроса.Позвольте мне попытаться объяснить:

Я использую панель поиска в моем быстром приложении 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 голосов
/ 02 октября 2018

Вы не должны вызывать асинхронную анимацию панели поиска 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

Также рекомендуется проверить, является ли ваш textView / textField / searchBar isFirstResponder перед вызовом resignFirstResponder.

Надеюсь, это поможет.Удачи!

...