ios ändern Schnell: Scrollen Sie die Ansicht nach oben, wenn die Tastatur angezeigt wird




iphone tastatur zahlen buchstaben (3)

Ich habe eine scrollView, die ich nach oben scrollen möchte, wenn die Tastatur angezeigt wird.

Ich habe einen Absturz mit diesem Fehler, wenn die Tastatur zeigt:

2014-09-29 14: 48: 50.738 swrd [1563: 472888] - [swrd.EditPhotoViewController keyboardWasShown]: unerkannter Selektor, der an Instanz 0x14ed36640 gesendet wird

Hier ist mein Code, was ist los?

   func registerForKeyboardNotifications ()-> Void   {

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown", name: UIKeyboardDidShowNotification, object: nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden", name: UIKeyboardWillHideNotification, object: nil)


}

func deregisterFromKeyboardNotifications () -> Void {
    let center:  NSNotificationCenter = NSNotificationCenter.defaultCenter()
    center.removeObserver(self, name: UIKeyboardDidHideNotification, object: nil)
    center.removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)


}


 func keyboardWasShown (notification: NSNotification) {

    let info : NSDictionary = notification.userInfo!
    let keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey)?.frame

    let insets: UIEdgeInsets = UIEdgeInsetsMake(self.scrollView.contentInset.top, 0, keyboardSize!.height, 0)

    self.scrollView.contentInset = insets
    self.scrollView.scrollIndicatorInsets = insets

    self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentOffset.y + keyboardSize!.height)

}

func keyboardWillBeHidden (notification: NSNotification) {

    let info : NSDictionary = notification.userInfo!
    let keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey)?.frame

    let insets: UIEdgeInsets = UIEdgeInsetsMake(self.scrollView.contentInset.top, 0, keyboardSize!.height, 0)

    self.scrollView.contentInset = insets
    self.scrollView.scrollIndicatorInsets = insets



}


 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)



   self.registerForKeyboardNotifications()

}

 override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(true)

    self.deregisterFromKeyboardNotifications()

}

Siehe unten eine eigenständige Lösung:

private func startObservingKeyboardEvents() {
  NSNotificationCenter.defaultCenter().addObserver(self,
    selector:Selector("keyboardWillShow:"),
    name:UIKeyboardWillShowNotification,
    object:nil)
  NSNotificationCenter.defaultCenter().addObserver(self,
    selector:Selector("keyboardWillHide:"),
    name:UIKeyboardWillHideNotification,
    object:nil)
}

private func stopObservingKeyboardEvents() {
  NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
  NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
}

func keyboardWillShow(notification: NSNotification) {
  if let userInfo = notification.userInfo {
    if let keyboardSize: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size {
      let contentInset = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0);
    }
  }
}

func keyboardWillHide(notification: NSNotification) {
  let contentInset = UIEdgeInsetsZero;
}

Verwenden Sie die Variable contentInset , um die Inhaltseinfügungen anzupassen.


In Ihrem Code nehmen keyboardWasShown und keyboardWasHidden jeweils ein Argument, die NSNotification . Sie müssen Ihre Selektoren in addObserver mit einem Doppelpunkt beenden, damit es übergeben wird. Dh, keyboardWasShown und keyboardWasShown: sind verschiedene Selektoren.

NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil)

In meinem Fall mussten einige Änderungen in den Codes oben:

1 - Zuerst müssen Sie eine Scrollansicht in Ihre Ansicht einfügen und folgende Einschränkungen festlegen:

Es ist wichtig, dass Ihr scrollView größer als die Ansicht ist.

2 - Stellen Sie Ihre TextFields und andere Komponenten, die Sie benötigen.

3 - Verknüpfen Sie ScrollView mit @IBOutlet zum ViewController

4 - Fügen Sie den Delegaten zu ScrollView hinzu:

class ViewController: UIViewController, UITextFieldDelegate,     UIScrollViewDelegate {
...

5 - Fügen Sie den Observer hinzu:

override func viewWillAppear(animated: Bool) {
   self.startKeyboardObserver()
}

override func viewWillDisappear(animated: Bool) {
   self.stopKeyboardObserver()
}


private func startKeyboardObserver(){
  NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) //WillShow and not Did ;) The View will run animated and smooth
  NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}

private func stopKeyboardObserver() {
  NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
  NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
}

6 - Hinzufügen Der Code zum Scrollen, Berechnung von KeyboardSize.

func keyboardWillShow(notification: NSNotification) {
      if let userInfo = notification.userInfo {
         if let keyboardSize: CGSize =    userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size {
            let contentInset = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height,  0.0);

        self.scrollView.contentInset = contentInset
        self.scrollView.scrollIndicatorInsets = contentInset

        self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, 0 + keyboardSize.height) //set zero instead self.scrollView.contentOffset.y

       }
    }
 }

func keyboardWillHide(notification: NSNotification) {
    if let userInfo = notification.userInfo {
       if let keyboardSize: CGSize =  userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size {
          let contentInset = UIEdgeInsetsZero;

        self.scrollView.contentInset = contentInset
        self.scrollView.scrollIndicatorInsets = contentInset
        self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentOffset.y)
       }
    }
 }






scrollview