2016-10-26 8 views
0

SOにはいくつかの類似の質問がありますが、以下の問題は解決しません。キーボードが表示されたときにビューを表示し、スクロールビューに表示します。 Swift 3

私は電子メールとパスワードのための2つのtextFieldsだけで簡単なログイン表示に取り組んでいます。 最高のUXは、ユーザーがtextFieldの1つをタップし、キーボードがポップインし、ビューが上に移動してscrollViewになるときです。 このようにして、ユーザーは画面上に他のどのUI要素が表示されているかを引き続き把握できます。 また、スワイプでキーボードを非表示にする必要があります。

class SignInVC: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var pwdField: UITextField! 
@IBOutlet weak var emailField: UITextField! 
@IBOutlet weak var scrollView: UIScrollView! 

var keyboardDismissTapGesture: UIGestureRecognizer? 

func dismissKeyboard(sender: AnyObject) { 
    pwdField?.resignFirstResponder() 
    emailField?.resignFirstResponder() 
} 

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

override func viewDidAppear(_ animated: Bool) { 

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
    NotificationCenter.default.addObserver(self, selector: #selector(self.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 
     } 
    } 

    if keyboardDismissTapGesture == nil 
    { 
     keyboardDismissTapGesture = UITapGestureRecognizer(target: self, 
                  action: #selector(self.dismissKeyboard)) 
     self.view.addGestureRecognizer(keyboardDismissTapGesture!) 
    } 
} 

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 
     } 
    } 

    if keyboardDismissTapGesture != nil 
    { 
     self.view.removeGestureRecognizer(keyboardDismissTapGesture!) 
     keyboardDismissTapGesture = nil 
    } 
} 

override func viewWillDisappear(_ animated: Bool) { 
    NotificationCenter.default.removeObserver(self) 

    super.viewWillDisappear(animated) 
} 

私は周りを再生しようとしていたscrollView.contentSizeもしようと:scrollViewせずにビューを構築し、resignFirstResponderによって、キーボードを閉じ

私ができた(Instagramのや他の大きな男の子が、これは実装されています)その起源を移動: scrollView.frame.origin.y -= keyboardSize.height

またはそのcontentSize: scrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height - keyboardSize.height)

しかし何も働かなかった。

キーボードのスワイプダウン機能に関して、scrollViewの属性インスペクタで、「キーボード」プロパティを「対話的に解除」に変更できるという情報がありました。 動作しませんでした。

答えて

1

//キーボードがテキストフィールドでのアクティブなテキストフィールドがdelegte

を開始しました設定

override func viewDidLoad() { 
    super.viewDidLoad() 
keyboardDismissTapGesture = UITapGestureRecognizer(target: self,               action:  #selector(self.dismissKeyboard))  
} 

//あなたのviewDidLoadでタップジェスチャーを却下追加activetextfiled

var activeTextField:UITextField! 

//を保持しているのUITextFieldを宣言

func textFieldDidBeginEditing(textField: UITextField) { 
activeTextField = textField 

    } 

func textFieldDidEndEditing(textField: UITextField) { 

    activeTextField = nil 
} 

// activeTextFieldのキーボードを無効にする

func dismissKeyboard(){ 
    activeTextField.resignFirstResponder() 
} 

//キーボードはキーボードが

func keyboardWillHide(notification:NSNotification){ 

    let contentInset:UIEdgeInsets = UIEdgeInsetsZero 
    self.scrollView.contentInset = contentInset 
} 
+0

はあなたのコードをテストするために空のプロジェクトを開始行くとき

func keyboardWillShow(notification:NSNotification){ var userInfo = notification.userInfo! var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue() keyboardFrame = self.view.convertRect(keyboardFrame, fromView: nil) var contentInset:UIEdgeInsets = self.scrollView.contentInset contentInset.bottom = keyboardFrame.size.height self.scrollView.contentInset = contentInset } 

//はscrollviewをリセットする表示されたときにscrollviewのコンテンツのサイズを調整します。ビューは動かなかった。キーボードが隠れていませんでした。 –

関連する問題