2017-06-23 14 views
0

私は必死にこれを理解しようとしています。私がしたいのは、ユーザーがクリックすることができるテキストフィールドのリストを持っていて、それがA)フィールドがブロックされていない、(その部分がわかっている)B)キーボードがポップアップしたときにビューが切り取られることはありません。これは私がこれまでに持っていたものです(http://imgur.com/a/LExyo)が、あなたは明らかにその問題を見ることができます - それは私がもっと遠くにスクロールできないビューのトップです。私はスクロールビューにすべてを埋め込み、スクロールビューのcontentsizeを変更しようとしましたが、それは何もしていません。どんな助けもありがとう。ありがとうございました。 (私は迅速にこれをやろうとしています3)。代わりに、コンテンツサイズのScrollviewのContentsizeを動的に設定できない

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

可能な重複https://stackoverflow.com/questions/28813339/move-a-view-up-only-when -the-keyboard-covers-an-input-fieldこれをうまく動作させることに問題がある場合は、おそらくコンテンツサイズ/制約レイアウトに問題があります。私はこの問題の解決策をここでキーボード解読とアクティブなtextFieldへスクロールしています。 https://github.com/kingreza/UIScrollViewSample/tree/master –

+0

ありがとうReza、それらは私が探していたドロイドでした。 –

答えて

0

利用コンテンツのインセット:

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

これは90%の解決策です。私はこのチュートリアルのスニペットを使用して、*ほとんどの*仕事を得ました:https://www.hackingwithswift.com/example-code/uikit/how-to-adjust-a-uiscrollview-to-fit-the-keyboard今問題は、 'scrollView.contentInset = UIEdgeInsets.zero'でウィンドウを閉じると、私は一番下に余分なスペースがあることです。こちらをご覧ください:http://imgur.com/a/GIHugゼロコマンドはキーボードスペースを完全になくすべきだと思いましたが、明らかにそうではありません。 –

+0

@ PeterWeyandビューフレームを変更するのではなく、 'scrollView.contentOffset'を使ってテキストフィールドを上下に移動します。 –

0

がVasilii Muravevを使用すると、1つの最後の間違いを持っ​​て答えるバックアップ。

ステップ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) 

ここからステップ2)

let inset = scrollViewInset.contentInset 
scrollView.contentInset = UIEdgeInsets(top: inset.top, left: inset.left, bottom: PREVIOUS_BOTTOM, right: inset.right) 
関連する問題