2017-01-30 2 views
0

Ich habe einen View-Controller mit Scroll innen und ich stellte es auf diese Weise (mit automatischen Layout) in Storyboard:Scroll Ansicht und Tastatur Ausgabe Swift

Example

Wie Sie sehen, ich alle Objekte in der hinzufügen letzte Ansicht ('viewsotto') im Scrollview. Mein Problem ist, dass: Einige dieser Objekte sind Textfeld und ich möchte, dass, wenn ich darauf tippen und Tastatur zeigt, es kann das Textfeld sein, so dass ich sehen kann, was ich darin schreibe. Aus diesem Grund habe ich es auf diese Weise tun:

NotificationCenter.default.addObserver(self, selector: #selector(userProfiloGiusto.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(userProfiloGiusto.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 

func keyboardWillShow(notification: NSNotification) { 

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

    } 

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

aber es funktioniert nicht. Was mache ich falsch?

+0

überprüfen Sie keine Notwendigkeit, https://github.com/hackiftekhar/IQKeyboardManager zu codieren – karthikeyan

+0

@karthikeyan hat Recht. es ist auch einfach zu implementieren. – vaibby

+0

danke. es ist wunderbar!! –

Antwort

0

Versuchen Sie den folgenden Code. Zuerst var activeField: UITextField? hinzufügen, um zu überprüfen, ob Textfelder verfügbar sind. Dann im Blick hat diese Funktion Ladeaufruf:

override func viewDidLoad() { 
    super.viewDidLoad()self.registerForKeyboardNotifications() 

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) 
    view.addGestureRecognizer(tap) 
    tap.cancelsTouchesInView = false} 


func registerForKeyboardNotifications() 
{ 
    //Adding notifies on keyboard appearing 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ProfileReviewViewController.keyboardWasShown(_:)), name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ProfileReviewViewController.keyboardWillBeHidden(_:)), name: UIKeyboardWillHideNotification, object: nil) 
} 


func deregisterFromKeyboardNotifications() 
{ 
    //Removing notifies on keyboard appearing 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 
} 
func keyboardWasShown(notification: NSNotification) 
{ 
    //Need to calculate keyboard exact size due to Apple suggestions 
    let info : NSDictionary = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0) 


    self.scrollView.contentInset = contentInsets 
    self.scrollView.scrollIndicatorInsets = contentInsets 
    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize!.height 
    if activeField != nil 
    { 
     if (CGRectContainsPoint(aRect, activeField!.frame.origin)) 
     { 
      scrollView.scrollRectToVisible(activeField!.frame, animated: true) 
     } 
    } 
} 

func keyboardWillBeHidden(notification: NSNotification) 
{ 
    self.scrollView.contentInset = UIEdgeInsetsZero 
} 
//MARK : Textfield delegate methods 
func textFieldDidBeginEditing(textField: UITextField) { 
    activeField = textField 
} 

func textFieldShouldReturn(textField: UITextField) -> Bool { 

    self.view.endEditing(true) 
    activeField = nil 
    return false 
} 
func textFieldShouldEndEditing(textField: UITextField) -> Bool { //delegate method 

    activeField = nil 
    return true 
} 
func dismissKeyboard() { 
    //Causes the view (or one of its embedded text fields) to resign the first responder status. 

    activeField = nil 
    view.endEditing(true) 
} 
0

Wahrscheinlich die Lesungen Sie zu verstehen, verwenden, wenn es überlappt sind nicht korrekt.
Es ist ein häufiges Problem, Sie konfrontieren sie mit Ihrer Hauptansicht, stattdessen sollten Sie den Rahmen des Textfelds erhalten, die richtige Konvertierung vornehmen, um zu sehen, ob die Tastatur es überlappt und den Inhalt des scrollview entsprechend anpassen. Z
Dies wird in der Managing the keyboard Dokumentation gut erklärt.
Wenn die Tastatur wird angezeigt:

func keyboardWasShown(notification: NSNotification) 
{ 
    let info : NSDictionary = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size! 
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0) 


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

    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your app might not need or want this behavior. 
    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize.height 
    if let actField = activeField 
    { 
     if (CGRectContainsPoint(aRect, actField.frame.origin)) 
     { 
      scrollView.scrollRectToVisible(actField.frame, animated: true) 
     } 
    } 
} 

Der wichtige Punkt ist, wenn sie die Höhe der Ansicht fragen sie die Tastaturhöhe subtrahieren und sie überprüfen der Textansicht ist innerhalb dieses Bereichs.
Diese Berechnung kann sich in Bezug auf Ihre Ansichtshierarchie ändern, da ein Rahmen die Position einer Ansicht in Bezug auf die Superansicht ist. Wenn sich Ihr Rect in einer anderen Ansicht befindet, müssen Sie den Rahmen umwandeln, um den Rahmen zu erhalten bezogen auf die Hauptansicht.

Verwandte Themen