MacOS Catalina 10.15.4
Xcode 11.6
Swift version 4
Textfieldをタップしてキーボードが表示される際、キーボードにTextfieldが隠れた時にだけ画面を上にずらしてTextfieldが表示されるようにしたいです。
ただそのTextfieldは別のボタンを押下時に生成され、かつUIPanGestureRecognizer
を付与しているのでドラッグして移動可能にしています。ですので、座標が移動する度に異なります。
コードは以下のように記述してみたのですが、@objc func keyboardShow()でアクティブとなったTextfieldの座標を取得する方法が分かりませんでした。
色々サイトを見てみたのですが、ピンポイントな解決法が見当たらず…。
大変お手数ですが、良い方法があればご教示頂けませんでしょうか。
宜しくお願い致します。
swift4
1 2import UIKit 3 4class ViewController: UIViewController { 5 6 7 var textfieldarray : [UITextField] = [] 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 13 // キーボードを開く際に呼び出す通知 14 NotificationCenter.default.addObserver(self, selector: #selector(keyboardShow), name:UIResponder.keyboardWillChangeFrameNotification, object: nil) 15 16 // キーボードを閉じる際に呼び出す通知 17 NotificationCenter.default.addObserver(self, selector: #selector(keyboardHide), name:UIResponder.keyboardWillHideNotification, object: nil) 18 19 } 20 21 22 // キーボード表示時、キーボードと予測変換部分の高さ分画面を上へずらす 23 @objc func keyboardShow(notification: NSNotification) { 24 if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { 25 if self.view.frame.origin.y == 0 { 26 self.view.frame.origin.y -= keyboardSize.height 27 } else { 28 let suggestionHeight = self.view.frame.origin.y + keyboardSize.height 29 self.view.frame.origin.y -= suggestionHeight 30 } 31 } 32 } 33 34 // キーボード非表示時、画面を元の高さに 35 @objc func keyboardHide(){ 36 if self.view.frame.origin.y != 0 { 37 self.view.frame.origin.y = 0 38 } 39 } 40 41 override func viewWillDisappear(_ animated: Bool) { 42 super.viewWillDisappear(animated) 43 NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil) 44 NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) 45 } 46 } 47 48 //画面をタップするとキーボードを閉じる 49 @IBAction func tapscreen(_ sender: Any) { 50 self.view.endEditing(true) 51 } 52} 53 54//Textfieldを生成するfunc 55 func createseat(){ 56 57 let textfield = UITextField() 58 59 seatarray.append(textfield) 60 61 //何番目に生成されたかによってx座標をずらす。 62 textfield.frame = CGRect(x: 50*seatarray.count, 63 y: 300, 64 width: 100, 65 height: 100) 66 67 // "UIPanGestureRecognizer"を付与 68 let panGetsture = UIPanGestureRecognizer(target: self, action: #selector(panAction)) 69 textfield.addGestureRecognizer(panGetsture) 70 71 // 以下の処理を入れることでタッチ許可する 72 textfield.isUserInteractionEnabled = true 73 74 self.view.addSubview(textfield) 75 } 76 77 // UITextfieldドラッグ時の処理 78 @objc func panAction(sender: UIPanGestureRecognizer) { 79 80 // ※引数の"sender"に、viewが含まれている。 81 let point: CGPoint = sender.translation(in: sender.view ) 82 83 let movedPoint = CGPoint(x:sender.view!.center.x + point.x, y:sender.view!.center.y + point.y) 84 sender.view?.center = movedPoint 85 86 87 // ドラッグで移動した距離をリセット 88 sender.setTranslation(CGPoint.zero, in: sender.view) 89 } 90 91//このボタンを押せばTextfieldを生成する 92@IBAction func seatplus(_ sender: Any) { 93 createseat() 94}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/19 10:13
2020/08/21 02:57 編集
2020/10/27 23:14