2017-06-23 3 views
0

Ich versuche verzweifelt, das herauszufinden, ich habe den ganzen Tag ohne Glück damit verbracht. Alles, was ich tun möchte, ist eine Liste von Textfeldern zu haben, auf die ein Benutzer klicken kann, und es wird die Tastatur auf die Seite legen, so dass A) das Feld nicht blockiert ist und (ich habe diesen Teil herausgebildet) und B) den Anfang von Die Ansicht wird nicht abgeschnitten, wenn die Tastatur aufspringt. Das ist, was ich bis jetzt (http://imgur.com/a/LExyo) habe, aber Sie können das Problem deutlich sehen ~ das ist der obere Teil der Ansicht, die ich nicht weiter scrollen kann. Ich habe versucht, das Ganze in einer Scrollview zu vergraben und dann die Inhaltsgröße der Scrollview zu ändern, aber das hat nichts bewirkt. Jede Hilfe wäre willkommen. Vielen Dank. (Ich versuche das in swift 3).Scrollview's Contentsize dynamisch einstellen funktioniert nicht

class ViewController4: UIViewController, UITextFieldDelegate { 

    var dataState: Data? 

    @IBOutlet weak var UserNameLabel: UILabel! 

    @IBOutlet weak var TextField1Outlet: UITextField! 


    @IBOutlet weak var TextField2Outlet: UITextField! 

    @IBOutlet weak var TextField3Outlet: UITextField! 


    @IBOutlet weak var TextField4Outlet: UITextField! 


    @IBOutlet weak var TextField5Outlet: UITextField! 

    @IBOutlet var ViewFrame: UIView! 


    @IBOutlet weak var scrollView: UIScrollView! 


    @IBAction func TextField1Action(_ sender: Any) { 
    } 

    @IBAction func TextField2Action(_ sender: Any) { 
    } 


    @IBAction func TextField3Action(_ sender: Any) { 
    } 


    @IBAction func TextField4Action(_ sender: Any) { 
    } 


    @IBAction func TextField5Action(_ sender: Any) { 
    } 


    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     UserNameLabel.text = dataState?.LoginName 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destinationViewController = segue.destination as? ViewController1 { 
      destinationViewController.dataState = dataState 
     } 
    } 

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

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     scrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height) 
     scrollView.delegate = self as? UIScrollViewDelegate 

     TextField1Outlet.returnKeyType = UIReturnKeyType.done 
     TextField1Outlet.delegate = self 

     TextField2Outlet.returnKeyType = UIReturnKeyType.done 
     TextField2Outlet.delegate = self 

     TextField3Outlet.returnKeyType = UIReturnKeyType.done 
     TextField3Outlet.delegate = self 

     TextField4Outlet.returnKeyType = UIReturnKeyType.done 
     TextField4Outlet.delegate = self 

     TextField5Outlet.returnKeyType = UIReturnKeyType.done 
     TextField5Outlet.delegate = self 

     NotificationCenter.default.addObserver(self, selector: #selector(ViewController4.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(ViewController4.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 
       let newHeight = self.view.frame.height + keyboardSize.height 
       scrollView.contentSize = CGSize(width: self.view.frame.width, height: newHeight) 

      } 
     } 
    } 

    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 
       scrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height) 
      } 
     } 
    } 
} 
+0

Mögliches Duplikat von hier https://stackoverflow.com/questions/28813339/move-a-view-up-only-when -die-tastatur-deckt-ein-eingang-feld Wenn Sie Probleme haben, dies zu tun, gibt es wahrscheinlich etwas mit Ihrer Inhaltsgröße/Constraint-Layout. Ich habe funktionierende Lösung dieses Problems hier mit Tastaturabweisung und blättern Sie zum aktiven textField. https://github.com/kingreza/UIScrollViewSample/tree/master –

+0

Danke Reza, das waren die Droiden, die ich suchte. –

Antwort

0

Verwenden Inhalt Einsätze statt Inhaltsgröße:

scrollView.contentInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: /* keyboard height */, right: 0.0) 
+0

Ok, cool das ist eine 90% ige Lösung. Ich habe dieses Tutorial Snippet verwendet, um es * fast * arbeiten zu lassen: https://www.hackingwithswift.com/example-code/uikit/how-to-adjust-a-uiscrollview-to-fit-the-keyboard. Das Problem ist jetzt, dass wenn ich das Fenster mit 'scrollView.contentInset = UIEdgeInsets.zero 'schließe, bekomme ich extra Platz am unteren Rand. Siehe hier: http://imgur.com/a/GIHug. Ich dachte, der Null-Befehl hätte den Tastaturbereich vollständig eliminieren sollen, aber anscheinend nicht. –

+0

@PeterWeyand Verwenden Sie 'scrollView.contentOffset', um Textfelder nach oben und unten zu verschieben, anstatt den Ansichtsrahmen zu ändern. –

0

Sichern von Vasilij Muravev beantworten Sie einen letzten Fehler haben.

Schritt 1) ​​

let insets = scrollView.contentInset 
//Here you should save the PREVIOUS_BOTTOM 
scrollView.contentInset = UIEdgeInsets(top: insets.top, left: insets.left, bottom: /* keyboard height */, right: insets.right) 

Schritt 2)

let inset = scrollViewInset.contentInset 
scrollView.contentInset = UIEdgeInsets(top: inset.top, left: inset.left, bottom: PREVIOUS_BOTTOM, right: inset.right) 
Verwandte Themen