2016-08-31 5 views
1

In einem UIViewController habe ich mehrere Textfelder und eine Schaltfläche befindet sich am unteren Rand des UIViewController. Für die Schaltfläche habe ich eine untere Einschränkung mit einer Konstante von 0 festgelegt. Dann habe ich eine Steckdose von der unteren Einschränkung auf den UIViewController gemacht.Bewegen Sie die Taste, wenn die Tastatur erscheint swift

Wenn ich meinen Code ausführen, bewegt sich die Schaltfläche nicht nach oben. Ich habe Vorschläge zu Stackoverflow gesehen, die ich UIScrollView hinzufügen sollte, aber das bedeutet, ich müsste alle Objekte auf dem UIViewController löschen, die UIScrollView setzen und dann meine Objekte wieder auf dem UIVIewController platzieren.

@IBOutlet weak var bottomConstraint: NSLayoutConstraint!  

    // When tapping outside of the keyboard, close the keyboard down 
     override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    self.view.endEditing(true) 
} 

// Stop Editing on Return Key Tap. textField parameter refers to any textfield within the view 

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



// when keyboard is about to show assign the height of the keyboard to bottomConstraint.constant of our button so that it will move up 

    func keyboardWillShow(notification: NSNotification) { 
if let userInfo = notification.userInfo { 
    if let keyboardSize: CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 

     bottomConstraint.constant = keyboardSize.size.height 
     view.setNeedsLayout() 
    } 

    } 
} 

    // When keyboard is hidden, move the button to the bottom of the view 
func keyboardWillHide(notification: NSNotification) { 
    bottomConstraint.constant = 0.0 
    view.setNeedsLayout() 
} 

enter image description here

Antwort

1

Sie hinzufügen möchten (viewDidLoad) Beobachter Ihre Funktionen aufzurufen:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillShow), name: UIKeyboardDidShowNotification, object: nil) 
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillHide), name: UIKeyboardDidHideNotification, object: nil) 
+0

ich die Beobachter hinzugefügt und es funktionierte jedoch @ Ryan sagte, dass meine Umsetzung wird unerwartetes Verhalten aufgrund der verschiedenen iPhone-Bildschirmgrößen ausgesetzt werden.Er schlug eine Methode vor, aber es hat nicht funktioniert.Der Knopf hebt nicht mit der Tastatur, die Tastatur gibt nicht mehr zurück, wenn Sie außerhalb tippen, wenn Sie klopfen außerhalb der tastatur, die programmatische taste habe ich nun nicht mehr angezeigt, auf iphone 6 ist die taste nach unten gepinnt des Bildschirms, aber auf anderen Bildschirmen sieht das anders aus: 'nextButton.frame = CGRectMake (0, 620, 375, 50)'. Kannst du helfen? – bibscy

+0

Sieh dir das an: http://StackOverflow.com/a/32783960/846780 – Klevison

0

Der typische Weg, dies zu lösen wäre, die Tastatur mit dem Code zu bewegen wie folgt aus:

in ViewController-Klasse:

func keyboardWillShow(notification: NSNotification) { 

     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
      if view.frame.origin.y == 0{ 
       let height = keyboardSize.height 

       self.view.frame.origin.y += height 
      } 

     } 

    } 

    func keyboardWillHide(notification: NSNotification) { 
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
      if view.frame.origin.y != 0 { 
       let height = keyboardSize.height 
       self.view.frame.origin.y -= height 
      } 

     } 
    } 

in ViewDidLoad Methode:

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

Bitte lesen Sie dies: Die Art und Weise Sie versuchen, Ihr Problem zu lösen, ist nicht erlaubt. Wenn Sie im obigen Code den Wert view in den Namen Ihrer Schaltflächenvariablen ändern, wird die Schaltfläche hochgedrückt und fällt dann wieder ab. Dies liegt daran, Auto Layout und Programmatic Layout nicht zusammenarbeiten, ist es das eine oder andere. Die Art und Weise, wie Sie das beheben, besteht darin, diese Schaltfläche programmgesteuert (mit CGRect) zu erstellen und dann mit dem obigen Code nur diese Schaltfläche beim Drücken der Tastatur zu verschieben. (Tun Sie das von view auf Ihre Schaltfläche Variablennamen zu ändern

func keyboardWillShow(notification: NSNotification) { 

     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
      if view.frame.origin.y == 0{ 
       let height = keyboardSize.height 

       self.myButton.frame.origin.y += height 
      } 

     } 

    } 

    func keyboardWillHide(notification: NSNotification) { 
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
      if view.frame.origin.y != 0 { 
       let height = keyboardSize.height 
       self.myButton.frame.origin.y -= height 
      } 

     } 
    } 

Um die Schaltfläche programmatisch erstellen Sie Code ähnlich wie diese verwenden würde..

myButton.frame = CGRect(...) 
+0

Dies funktioniert nicht. Es macht meine Felder verschwinden – bibscy

+0

Könnten Sie mir bitte sagen, warum sagen Sie, dass die Art, wie ich es mache, seltsam ist? Denkst du, dass dies meinen Code bestimmten Fehlern aussetzt? – bibscy

+0

@bibscy Ich habe es herausgefunden. Schau dir meine aktualisierte Antwort an. Und ehrlich gesagt glaube ich, dass dies Layoutfehlern (insbesondere auf dem iPad-Layout oder kleineren iPhones) ausgesetzt sein wird, wenn die Textfelder selbst mehr als die Hälfte des Bildschirms einnehmen und der Button direkt über sie geht. Um das zu lösen, würde ich Ihre Textfelder in eine Bildlaufansicht einbetten. –

Verwandte Themen