2015-07-27 2 views
1

У меня есть страница входа и для небольших экранов (например, iPhone 4s) клавиатура может накладываться на кнопку входа и текстовое поле пароля и т. Д. Поэтому я разместил текстовое поле пользователя, текстовое поле пароля и войдите в UIView, который подключен к ViewController как loginView, и я хочу определить, находится ли клавиатура в loginView, она будет вызывать loginView и не накладываться на нее, а нажатие останавливается, когда клавиатура полностью открыта, поэтому loginView будет стоять просто на клавиатуре. И когда клавиатура закрыта, она вытащит loginView, пока не достигнет своей первой позиции.Как сделать UIView движением вверх, когда клавиатура присутствует

Я попытался это, но я»выталкивает все вид

var kbHeight: CGFloat! 

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

func animateTextField(up: Bool) { 
    var movement = (up ? -kbHeight : kbHeight) 

    UIView.animateWithDuration(0.3, animations: { 
     self.view.frame = CGRectOffset(self.view.frame, 0, movement) 
    }) 

} 

func keyboardWillShow(notification: NSNotification) { 

    if let userInfo = notification.userInfo { 
     if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
      kbHeight = keyboardSize.height 
      self.animateTextField(true) 
     } 
    } 

} 

func keyboardWillHide(notification: NSNotification) { 

    self.animateTextField(false) 

} 

это образец я нашел во многих веб-сайт, что люди имеют те же проблемы с меня используют это. Я изменил эту строку self.view.frame = CGRectOffset(self.view.frame, 0, movement) с self.loginView.frame = CGRectOffset(self.view.frame, 0, movement) , потому что я хочу нажать мой вид входа в систему, который имеет текстовые поля и кнопки внутри него, но он по-прежнему не работает и не закрывает кнопку входа в систему, поэтому не нажимайте правильно. Я был бы рад, если кто-нибудь сможет объяснить мне, как это сделать или показать мне источник, который объясняет это, я искал, но не смог найти, возможно, я пропустил.

Вот мой UI http://i62.tinypic.com/1bssy.png

Спасибо советы

+0

вы можете использовать TPkeyboardavoidingscrollview. –

ответ

3

Сделайте следующие изменения в коде

Заменить этот

func keyboardWillShow(notification: NSNotification) { 

     if let userInfo = notification.userInfo { 
      if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
      kbHeight = keyboardSize.height 
       self.animateTextField(true) 
      } 
     } 
    } 

с

func keyboardWillShow(notification : NSNotification) { 

     var keyboardInfo : NSDictionary = notification.userInfo! 

     var kbSize : CGSize = ((keyboardInfo.objectForKey(UIKeyboardFrameEndUserInfoKey)) as! CGRect).size 


     var durationValue : NSNumber = keyboardInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber 
     var animationDuration : NSTimeInterval = durationValue.doubleValue 

     let rawAnimationCurveValue = (keyboardInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).unsignedIntegerValue 
     let keyboardAnimationCurve = UIViewAnimationCurve(rawValue: rawAnimationCurveValue) 

     let options = UIViewAnimationOptions(UInt((keyboardInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue << 16)) 

     UIView.animateWithDuration(animationDuration, delay: 0, options:options , animations: {() -> Void in 

      self.loginView.frame = CGRectMake(self.loginView.frame.origin.x, self.loginView.frame.origin.y - kbSize.height, self.loginView.frame.size.width, self.loginView.frame.size.height) 

     }, completion: nil) 
    } 

И

Это

func keyboardWillHide(notification: NSNotification) { 

    self.animateTextField(false) 

} 

с

func keyboardWillHide(notification : NSNotification) { 

     var keyboardInfo : NSDictionary = notification.userInfo! 

     var kbSize : CGSize = ((keyboardInfo.objectForKey(UIKeyboardFrameEndUserInfoKey)) as! CGRect).size 


     var durationValue : NSNumber = keyboardInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber 
     var animationDuration : NSTimeInterval = durationValue.doubleValue 

     let rawAnimationCurveValue = (keyboardInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).unsignedIntegerValue 
     let keyboardAnimationCurve = UIViewAnimationCurve(rawValue: rawAnimationCurveValue) 

     let options = UIViewAnimationOptions(UInt((keyboardInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue << 16)) 

     UIView.animateWithDuration(animationDuration, delay: 0, options:options , animations: {() -> Void in 

      self.loginView.frame = CGRectMake(self.loginView.frame.origin.x, self.loginView.frame.origin.y + kbSize.height, self.loginView.frame.size.width, self.loginView.frame.size.height) 

     }, completion: nil) 
    } 
+0

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

+0

Я проверил ваше сообщение. См. Мой обновленный ответ, если вам нужно установить анимацию на клавиатуре, появится метод. –

+0

он не работал. Нам нужно обновить kbSize одновременно, а не устанавливать его как CGSize = ((keyboardInfo.objectForKey (UIKeyboardFrameEndUserInfoKey)) как! CGRect) .size (я изменил эту строку так, как это, потому что «CGSize = ((keyboardInfo.objectForKey (UIKeyboardFrameEndUserInfoKey)) как! CGRect).size "дает ошибку), потому что он дает фиксированное значение, но он изменяется от 0 до 216, через 0,25 секунды, поэтому, пока он изменяется, нам нужно изменить kbSize тоже, я думаю. Как вы думаете? – marmaralone

0

Оно не работает хорошо, но ваш ответ дает мне мнение. это работает, но это работает, когда клавиатура полностью открыта, так что его не анимировать :)

func animateTextField(up: Bool) { 

    var movement = (up ? -kbHeight : kbHeight) 

    UIView.animateWithDuration(0.3, animations: { 

     if (up == true) { 

      self.loginView.frame = CGRectMake(self.loginView.frame.origin.x, self.loginView.frame.origin.y - self.kbHeight, self.loginView.frame.size.width, self.loginView.frame.size.height) 
     } else { 

      self.loginView.frame = CGRectMake(self.loginView.frame.origin.x, self.loginView.frame.origin.y + self.kbHeight, self.loginView.frame.size.width, self.loginView.frame.size.height) 
     } 
    }) 
} 

func keyboardWillHide(notification: NSNotification) { 

    self.animateTextField(false) 

} 

func keyboardDidShow(notification: NSNotification) { 

    if let userInfo = notification.userInfo { 

     if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
      kbHeight = keyboardSize.height - self.loginView.frame.size.height 
      self.animateTextField(true) 
     } 
    } 
} 

, когда я поставил точку останова на USERINFO линии, я получаю это

[UIKeyboardFrameBeginUserInfoKey: NSRect: {{0, 480}, {320, 216}}, UIKeyboardCenterBeginUserInfoKey: NSPoint: {160, 588}, UIKeyboardFrameEndUserInfoKey: NSRect: {{0, 264}, {320, 216}}, UIKeyboardCenterEndUserInfoKey: NSPoint: {160, 372}, UIKeyboardAnimationDurationUserInfoKey: 0.25, UIKeyboardBoundsUserInfoKey: NSRect: {{0, 0}, {320, 216}}, UIKeyboardAnimationCurveUserInfoKey: 7] 

Как я могу начать анимацию keyboardWillShow и использовать анимацию открытия клавиатуры. Я имею в виду, что клавиатура начнет показывать, и когда она достигнет края обзора, она начнет толкать. Мне нужно сделать это в функции keyboardWillShow, потому что keyboardDidShow работает, но не одновременно нажимает вид.

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