2017-02-21 8 views
-1

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

Когда я нажимаю текстовое поле в тренажере, высота клавиатуры была 302. Когда я пытаюсь включить и выключить программную клавиатуру, она отображает 260 при появлении клавиатуры. Почему это происходит?

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(FriendsViewController.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil) 

func keyboardWillShow(notification: NSNotification) { 
    print("Keyboard appearing") 
    guard let keyboardHeight = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardFrameBeginUserInfoKey)?.CGRectValue.size.height else { 
     return 
    } 
    bottomConstraint.constant = keyboardHeight 
    print("keyboard height : \(keyboardHeight)") 
    self.view.layoutIfNeeded() 
} 

Высота 260 на самом деле правильная высота, так как это отрегулировано мои взгляды отлично. С высотой 302 мои взгляды смещаются слишком далеко.

Расположение моего представления есть. UITextField сверху и затем под ним находится UITableView.

+0

Какое устройство вы используете? –

+0

Имитация на iPhone 7 –

+0

OK Позвольте мне проверить ваш код здесь, дождаться пока. –

ответ

0

Проблема в том, что вы смотрите на UIKeyboardFrameBeginUserInfoKey. То, что вы хотите посмотреть, это UIKeyboardFrameEndUserInfoKey.

+0

И есть другие проблемы с вашим кодом. Вам нужно преобразовать из координат окна в локальные координаты, плюс вам не нужно делать никаких предположений о высоте клавиатуры - вместо этого посмотрите на положение клавиатуры _top_. – matt

+0

Спасибо, друг.:) –

0

Модифицированный ответ Matt с разумом,

Он прав вам нужно использовать UIKeyboardFrameEndUserInfoKey вместо UIKeyboardFrameBeginUserInfoKey потому

  1. UIKeyboardFrameEndUserInfoKey дает окончательную высоту в соответствии с prefences вы установили в настройках.

  2. UIKeyboardFrameEndUserInfoKey возвращает вас высотой в два раза первые один без прогнозирования языка, как вы можете видеть выше клавиатуры и следующего с предикатом, если он активируется с установки, но UIKeyboardFrameBeginUserInfoKey возвращается без панели прогнозирования.

Высота на тумблер в iPhone 5s

enter image description here

+0

Когда я нажимаю на 'UITextField', он по-прежнему показывает большую высоту' 302' на iPhone 7. Только когда я включал и выключал клавиатуру программного обеспечения, ему удалось показать правильную высоту '260 ' –

+0

@MaTaKazer Смотрите изображение, которое я добавил в ответ, это результат, который я получил, когда я переключаю программную клавиатуру. Я проверил в '5s', поэтому его' 216 & 253' не '260 & 302'. –

+0

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

0

это, как я сделал в быстром 2 первых добавить эту функцию:

// Lifting the view up 
func animateViewMoving (up:Bool, moveValue :CGFloat){ 
    let movementDuration:NSTimeInterval = 0.3 
    let movement:CGFloat = (up ? -moveValue : moveValue) 
    UIView.beginAnimations("animateView", context: nil) 
    UIView.setAnimationBeginsFromCurrentState(true) 
    UIView.setAnimationDuration(movementDuration) 
    self.view.frame = CGRectOffset(self.view.frame, 0, movement) 
    UIView.commitAnimations() 
} 

, а затем реализовать UITextFieldDelegate:

// MARK: - UITextFieldDelegate 

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    // Hide the keyboard. 
    textField.resignFirstResponder() 
    return true 
} 

func textFieldDidEndEditing(textField: UITextField) { 
    animateViewMoving(false, moveValue: 100) 
    textField.resignFirstResponder() 
} 

func textFieldDidBeginEditing(textField: UITextField) { 
    animateViewMoving(true, moveValue: 100) 
} 

вы также можете получить точную высоту клавиатуры так:

var viewLiftUpValue : CGFloat 

func keyboardWillShow(notification:NSNotification) { 

     let userInfo:NSDictionary = notification.userInfo! 
     let keyboardFrame:NSValue = userInfo.valueForKey(UIKeyboardFrameEndUserInfoKey) as! NSValue 
     let keyboardRectangle = keyboardFrame.CGRectValue() 
     let keyboardHeight = keyboardRectangle.height 
     viewLiftUpValue = keyboardHeight 
    } 

, а затем передать его функции animateViewMoving()