UITextFieldDelegate впорос по роботе


#1

Есть такой метод

func textFieldDidBeginEditing(_ textField: UITextField) {
    scrollView.setContentOffset(CGPoint(x: 0.0, y: 250.0), animated:  true)
    print ("Begin Editing")
}

Проблема: при первом использовании анимация не отображается, а textField просто делает скачек вверх, при повторном использовании все работает плавно
В чем может быть проблема?


#2
func textFieldDidBeginEditing(_ textField: UITextField) {
    UIView.animate(withDuration: 0.3) {
        self.scrollView.setContentOffset(CGPoint(x: 0.0, y: 250.0), animated: false)
    }
}

Или:

func textFieldDidBeginEditing(_ textField: UITextField) {
    DispatchQueue.main.async {
        self.scrollView.setContentOffset(CGPoint(x: 0.0, y: 250.0), animated:  true)
    }
}

#3

Спасибо большое! а можно обьяснить почему не работал мой вариант?


#4

Так с ходу прям не скажу. Очевидно что вместе с методом textFieldDidBeginEditing, TextField вызывает анимацию клавиатуры, а вы в этом методе вызываете setContentOffset(неизвестно как там эта анимация реализована) от чего возникает конфликт, капать нужно в сторону CAAnimation. Если setContentOffset запустить асинхронно то анимация сработает после того как отработает анимация клавиатуры, правильное в данном случае решение, заворачивать setContentOffset в блок animate withDuration и ставить animated: false

UIView.animate(withDuration: 0.3) {
    self.scrollView.setContentOffset(CGPoint(x: 0.0, y: 250.0), animated: false)
}

То есть не использовать ту анимацию которая реализована в setContentOffset, смело можно списать на особенности реализации UIScrollView :slight_smile: подобное можно также наблюдать в его подклассах UITableView и UICollectionView.


#5

Спасибо!как-то так и думал)