2016-05-07 2 views
0

Я работаю над приложением iOS, и в настоящее время все мои элементы находятся в режиме прокрутки, и когда клавиатура присутствует, я перемещаю вид на 250 очков. Это решило мою проблему, но клавиатура всегда отличается для каждого устройства.Быстрое перемещение прокрутки вверх, когда присутствует клавиатура

Как я могу определить, насколько далеко от нижней части экрана находится мое текстовое поле и насколько высока клавиатура?

ответ

2

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

extension UIViewController { 
    func registerForKeyboardDidShowNotification(scrollView: UIScrollView, usingBlock block: (NSNotification -> Void)? = nil) { 
     NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardDidShowNotification, object: nil, queue: nil, usingBlock: { (notification) -> Void in 
      let userInfo = notification.userInfo! 
      let keyboardSize = userInfo[UIKeyboardFrameBeginUserInfoKey]?.CGRectValue.size 
      let contentInsets = UIEdgeInsetsMake(scrollView.contentInset.top, scrollView.contentInset.left, keyboardSize!.height, scrollView.contentInset.right) 

      scrollView.scrollEnabled = true 
      scrollView.setContentInsetAndScrollIndicatorInsets(contentInsets) 
      block?(notification) 
     }) 
    } 

    func registerForKeyboardWillHideNotification(scrollView: UIScrollView, usingBlock block: (NSNotification -> Void)? = nil) { 
     NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardWillHideNotification, object: nil, queue: nil, usingBlock: { (notification) -> Void in 
      let contentInsets = UIEdgeInsetsMake(scrollView.contentInset.top, scrollView.contentInset.left, 0, scrollView.contentInset.right) 
      scrollView.setContentInsetAndScrollIndicatorInsets(contentInsets) 
      scrollView.scrollEnabled = false 
      block?(notification) 
     }) 
    } 
} 

extension UIScrollView { 
    func setContentInsetAndScrollIndicatorInsets(edgeInsets: UIEdgeInsets) { 
     self.contentInset = edgeInsets 
     self.scrollIndicatorInsets = edgeInsets 
    } 
} 

И в вашем UIViewController, в котором вы хотите переместить Scrollview, просто добавьте следующие строки под функцией viewDidLoad()

override func viewDidLoad() { 
    super.viewDidLoad() 

    registerForKeyboardDidShowNotification(scrollView) 
    registerForKeyboardWillHideNotification(scrollView) 
} 
+0

Ницца! Это работает для UITextField, но не работает для UITextView. Любая идея почему? – Vitaly

0

@noir_eagle ответ кажется правильным.

Но может быть и более простое решение. Возможно, вы можете попробовать использовать IQKeyboardManager. Это позволяет вам легко и просто обрабатывать эти вещи клавиатуры.

Я думаю, вы действительно должны, по крайней мере, потратить несколько минут на это.

1

В настоящее время я работаю над этим и нашел решение. Сначала вам нужно добавить уведомление диспетчеру просмотра, чтобы определить, включена ли клавиатура или нет. Для этого вам необходимо зарегистрировать это уведомление в viewDidLoad().

override func viewDidLoad() { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardDidShow:", name: UIKeyboardWillChangeFrameNotification, object: nil) 
} 

А также не забудьте удалить это уведомление, когда контроллер вида удален из представления. Поэтому удалите это уведомление в viewDidDisappear().

override func viewDidDisappear(animated: Bool) { 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillChangeFrameNotification, object: nil) 
} 

И последнее, что нужно для управления прокруткой, когда клавиатура включена или выключена. Поэтому сначала вам нужно определить высоту клавиатуры. Тогда для довольно гладкой анимации вы можете использовать настроение и продолжительность анимации клавиатуры для анимации вашего прокрутки.

func keyboardDidShow(notification: NSNotification) { 
    if let userInfo = notification.userInfo { 
     let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() 
     let duration:NSTimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0 
     let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber 
     let animationCurveRaw = animationCurveRawNSN?.unsignedLongValue ?? UIViewAnimationOptions.CurveEaseInOut.rawValue 
     let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw) 
     if endFrame?.origin.y >= UIScreen.mainScreen().bounds.size.height { 
      //isKeyboardActive = false 
      UIView.animateWithDuration(duration, 
      delay: NSTimeInterval(0), 
      options: animationCurve, 
      animations: { 
      // move scroll view height to 0.0 
      }, 
      completion: { _ in 
     }) 
     } else { 
      //isKeyboardActive = true 
      UIView.animateWithDuration(duration, 
      delay: NSTimeInterval(0), 
      options: animationCurve, 
      animations: { 
      // move scroll view height to endFrame?.size.height ?? 0.0 
      }, 
      completion: { _ in 
     }) 
     } 
    } 
} 
Смежные вопросы