2015-03-27 3 views
1

Я пытаюсь переместить мой self.view вверх, когда появляется клавиатура.Перемещение вида, когда клавиатура показывает для secureTextEntry

Я нормальный:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil) 
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil) 

в моем viewDidLoad(), как я обычно делаю. С этими двумя функциями.

func keyboardWillShow(sender: NSNotification) { 
    self.view.frame.origin.y -= 160 
} 
func keyboardWillHide(sender: NSNotification) { 
    self.view.frame.origin.y += 160 
} 

Однако этот конкретный вид. имеет разные типы клавиатур для UITextFields.

В частности, эти текстовые поля являются:

firstName - normal keyboard 
lastName - normal keyboard 
email - email keyboard 
password - secureTextEntry 

Мои обычные функции, кажется, работает хорошо для всех из них, кроме пароля. К сожалению, когда я нажимаю «next/return» на мой адрес электронной почты UITextField. Он переводит мой взгляд на еще 160 пунктов.

Очевидно, что я добавляю еще одну клавиатуру, не снимая ее.

Моя первая мысль состояла в том, чтобы просто изменить значение, когда вызывается конкретный UITextField. Но представление действует так, как предполагается, когда я просто нажимаю пароль UITextField.

Это только беспорядок, когда я нахожусь в одном из других представлений, затем нажмите кнопку «Далее» или нажав на пароль UITextFIeld, поэтому я не могу просто указать, насколько перемещается вид, в textFieldShouldReturn.

Как правильно перемещать представление, принимая во внимание проблему secureTextEntry?

Как было предложено Джоко Сармьенто Я попытался это так:

var originalFrame: CGRect! 

override func viewDidLoad() { 
    originalFrame = self.view.frame 
} 

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    self.view.frame = originalFrame 
    return false 
} 

Я также добавил self.view.frame = originalFrame к моему событию touchesBegan, поскольку, как упоминалось ранее, это не только по возвращении.

Но вышеуказанная попытка не сработала, вот скриншот поля пароля после нажатия рядом с полем электронной почты. И он остается таким же образом после отклонения текстового поля.

enter image description here

Я также попытался сдвинув его с self.view.frame = originalframe.origin.y+160 вместо этого. Но все еще вызывает проблему с полем пароля.

Причина, по которой это беспорядок происходит из-за моего errorView, который меняет высоту. Сделать это так, чтобы originalFrame был некорректен.

Любая помощь была бы принята с благодарностью!

ответ

1

Я испытал это некоторое время назад. Кажется, ваш метод keyboardWillHide: не вызывается, когда поле пароля становится первым ответчиком.

Вы можете сбросить происхождение вашей точки зрения на его первоначальное значение в textFieldShouldReturn:, не добавляя 160px, но имеющий originalValue переменных, которые вы установили в viewDidLoad.

Вы можете сделать что-то вроде:

var originalFrame: CGRect! 

override func viewDidLoad() { 
    originalFrame = self.view.frame 
} 

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    self.view.frame = originalFrame 

    return false 
} 

Edit 1:

Я просто заметил, что приведенный выше код будет работать только при нажатии на кнопку возврата. Вы должны сбросить рамку представления всякий раз, когда текстовое поле подает в отставку первого ответчика.


Edit 2:

Эта проблема должна быть легко решена, если вы использовали UIScrollView с вашей точки зрения содержания. Вставьте свои элементы формы в UIScrollView, и всякий раз, когда приложение запускает keyboardWillShow: или keyboardWillHide:, вы корректируете свойство contentInsetUIScrollView на основании высоты клавиатуры (которую вы можете получить из userInfo).

Во всяком случае, так как вы решили эту проблему без необходимости использовать UIScrollView, вот объяснение, почему ваш подход не работает, и как вы могли бы получил его на работу:

  1. Во-первых, вы были пытаясь вычесть/добавить фиксированную высоту 160px в представление содержимого. Вы должны понимать, что высота клавиатуры отличается на разных устройствах. Хорошим подходом является использование высоты клавиатуры, которую вы получаете от NSNotificationuserInfo. Это легко получить через notification.userInfo в вашем keyboardWillShow: или keyboardWillHide:.

  2. Вы не сбрасывали self.view в исходную рамку. Это может привести к многократной модификации Y-начала кадра, без сброса, что приведет к удвоению вычитаемых пикселей и т. Д. Поскольку вы используете self.view.frame.origin.y -= 160, если уведомление UIKeyboardWillShowNotification не срабатывало при переключении в поле пароля, источник не сбрасывается и вычитает дополнительно 160px.

  3. UIKeyboardWillHideNotification может не срабатывать все это время, когда вы переключаете текстовое поле пароля. Мне все же нужно подтвердить это, но это может быть причиной того, что ваша функция keyboardWillHide: не вызывается, вычитая дополнительно 160px вместо добавления 160px, а затем вычитая 160px.

+0

Пробовал, но он все еще запутывается. Я отредактирую свой пост с обновленным снимком экрана –

+0

Есть ли конкретная причина, по которой вы не можете использовать UIScrollView? Если вы можете это сделать, это очень поможет: http://creativecoefficient.net/swift/keyboard-management/ –

+0

Я перерисовал viewController со списком прокрутки. И добавил точный код в ссылке. Однако ничего не происходит, когда я нажимаю текстовое поле и появляется клавиатура. (мой scrollview назван тем же). –

Смежные вопросы