Ссылка на предыдущий вопрос: UITextField text jumpsUITextField текст перескакивает IOS 9
Коротко: У меня есть ViewController
с 2 UITextField
элементами. Когда loginField является firstResponder, после
self.passwordField.becomeFirstResponder()
текст в поле логина переходит на левый верхний угол и обратно. И что более странно: этот глюк воспроизводит только первый раз, то вам необходимо заново ViewController
наблюдать такое поведение
Вот видео глюка http://tinypic.com/player.php?v=6nsemw%3E&s=8#.VgVb3cuqpHx
я закончил с этим (не работает прошивка 9) :
func textFieldShouldReturn(textField: UITextField) -> Bool {
if textField === self.loginField {
self.loginField.resignFirstResponder()
// Shitty workaround. Hi, Apple!
self.loginField.setNeedsLayout()
self.loginField.layoutIfNeeded()
self.passwordField.becomeFirstResponder()
return false
}
return true
}
Есть ли кто-нибудь, кто попал в эту ошибку? Какие-либо предложения?
уведомления клавишные обработчики
Моя главная точка зрения UIScrollView, для которых я меняю нижнее пространство SuperView, так что пользователь может прокручивать все содержимое, даже когда клавиатура отображается
func keyboardWillShow(notification : NSNotification) {
let keyboardInfo = notification.userInfo!
let keyboardFrame = keyboardInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue
let animDuration = keyboardInfo[UIKeyboardAnimationDurationUserInfoKey]!.doubleValue!
UIView.animateWithDuration(animDuration, animations: {
self.scrollViewBottom.constant = keyboardFrame.height
self.view.layoutIfNeeded()
let offsetY = CGRectGetMaxY(self.loginButton.frame) + 10 - self.scrollView.frame.height
if offsetY > 0 {
self.scrollView.contentOffset = CGPointMake(0, offsetY)
}
})
}
func keyboardWillHide(notification : NSNotification) {
self.scrollViewBottom.constant = 0
self.view.layoutIfNeeded()
}
Как я обнаружил уведомления клавиатуры в iOS7, 8 и 9 очень отличаются. Таким образом, в iOS 9 уведомления отправляются при изменении первогоResponder, даже если клавиатура не будет показывать/скрывать. Кроме того, когда я меняю firstResponder с нажатием на textField (не нажимая Next на клавиатуре, который обрабатывается моим кодом), есть только уведомление KeyboardWillShow и не KeyboardWillHide. И как для меня, USERINFO имеет несколько значений трэша кадров, здесь необходимо войти при смене первого ответчика с помощью следующей кнопки (работает нормально, без глюков):
2015-10-07 12: 54: 13,870 keyboardWillHide: [ UIKeyboardFrameBeginUserInfoKey: NSRect: {{0, 352}, {320, 216}}, UIKeyboardCenterBeginUserInfoKey: NSPoint: {160, 460}, UIKeyboardFrameEndUserInfoKey: NSRect: {{0, 568}, {320, 216}}, UIKeyboardCenterEndUserInfoKey : NSPoint: {160, 676}, UIKeyboardAnimationDurationUserInfoKey: 0.25, UIKeyboardIsLocalUserInfoKey: 1, UIKeyboardBoundsUserInfoKey: NSRect: {{0, 0}, {320, 216}}, UIKeyboardAnimationCurveUserInfoKey: 7] 2015-10-07 12: 54: 13,896 keyboardWillShow: [UIKeyboardFrameBeginUserInfoKey: NSRect: {{0, 352}, {320, 216}}, UIKeyboardCenterBeginUserInfoKey: NSPoint: {160, 460}, UIKeyboardFrameEndUserInfoKey: NSRect : {{0, 352}, {320, 216}}, UIKeyboardCenterEndUserInfoKey: NSPoint: {160, 460}, UIKeyboardAnimationDurationUserInfoKey: 0.25, UIKeyboardIsLocalUserInfoKey: 1, UIKeyboardBoundsUserInfoKey: NSRect: {{0, 0}, {320 , 216}}, UIKeyboardAnimationCurveUserInfoKey: 7]
А вот войти, когда я нажимаю на второй TextField:
2015-10-07 12:55:13.879 keyboardWillShow: [UIKeyboardFrameBeginUserInfoKey: NSRect: {{0, 352}, {320, 216}}, UIKeyboardCenterBeginUserInfoKey: NSPoint: {160, 460}, UIKeyboardFrameEndUserInfoKey: NSRect: {{0, 352}, {320, 216}}, UIKeyboardCenterEndUserInfoKey: NSPoint: {160, 460},
UIKeyboardAnimationDurationUserInfoKey: 0.25, UIKeyboardIsLocalUserInfoKey: 1, UIKeyboardBoundsUserInfoKey: NSRect: {{0, 0}, {320, 216}}, UIKeyboardAnimationCurveUserInfoKey: 7]
Резолюция
Я обнаружил, что у меня есть другой контроллер клавиатуры, который получает уведомления о клавиатуре и делает некоторые анимации. Вот где проблема лежит
Как вы управляете клавиатурой? У вас есть зарегистрированные уведомления о клавиатуре, которые будут отображаться/скрываться? Если да, можете ли вы опубликовать код, что вы там делаете? – haluzak
Tnx для справки, проверьте отредактированный пост – user3237732
Вы получите скроете уведомление, потому что вы вызываете resignFirstResponder() до начала FirstResponder(), «прыжки» вызваны анимацией в клавиатуреWillShow() – haluzak