前提・実現したいこと
テキストフィールドを選択した時にキーボードが被ってしまう場合のみ、
Viewを持ち上げてキーボードが被らない様に実装したい。
発生している問題・エラーメッセージ
調べて出てきたコードをいじって、自分なりに書いてみましたがテキストフィールドを選択しても画面が動きません。
該当のソースコード
swift
1import UIKit 2import RealmSwift 3 4class AddMorningTextViewController : UIViewController, UITextFieldDelegate { 5 6 7 @IBOutlet weak var dateLabel: UILabel! 8 @IBOutlet weak var appreciationText1: UITextField! 9 @IBOutlet weak var appreciationText2: UITextField! 10 @IBOutlet weak var appreciationText3: UITextField! 11 12 @IBOutlet weak var makeGoodText1: UITextField! 13 @IBOutlet weak var makeGoodText2: UITextField! 14 @IBOutlet weak var makeGoodText3: UITextField! 15// 日付の取得 16 var dateResult = "" 17// TextFieldは2つあるからスクロール移動用に一つにまとめる 18 var selectedTextField: UITextField? 19// 画面の高さを取得 20 let screenSize = UIScreen.main.bounds.size 21 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillChangeFrameNotification, object: nil) 26 NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) 27 28 dateLabel.text = dateResult 29 appreciationText1.delegate = self 30 appreciationText2.delegate = self 31 appreciationText3.delegate = self 32 makeGoodText1.delegate = self 33 makeGoodText2.delegate = self 34 makeGoodText3.delegate = self 35 36 } 37 38 39// 選択したテキストフィールド取得 40 func textFieldDidBeginEditing(_ textField: UITextField) { 41 self.selectedTextField = textField 42 } 43 44// キーボードが開いた時 45 @objc func keyboardWillShow(notification: NSNotification) { 46 let textUnderHeight: CGFloat = selectedTextField!.frame.maxY 47 let screenHeight = screenSize.height 48 49 if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { 50 if screenHeight - textUnderHeight < keyboardSize.height { 51 self.view.frame.origin.y = keyboardSize.height + textUnderHeight - screenHeight + 20 52 } else { 53 self.view.frame.origin.y = 0 54 } 55 } 56 } 57 58// キーボードが閉じた時 59 @objc func keyboardWillHide() { 60 if self.view.frame.origin.y != 0 { 61 self.view.frame.origin.y = 0 62 } 63 } 64// Returnでキーボードを閉じる 65 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 66 self.view.endEditing(true) 67 return true 68 } 69 70 override func viewWillAppear(_ animated: Bool) { 71 72 super.viewWillAppear(animated) 73 74 let realm = try! Realm() 75 76 if let savedMorningTextData = realm.objects(MorningTextData.self).filter("date == '(self.dateResult)'").last { 77 self.appreciationText1.text = savedMorningTextData.appreciationTextData1 78 self.appreciationText2.text = savedMorningTextData.appreciationTextData2 79 self.appreciationText3.text = savedMorningTextData.appreciationTextData3 80 self.makeGoodText1.text = savedMorningTextData.makeGoodTextData1 81 self.makeGoodText2.text = savedMorningTextData.makeGoodTextData2 82 self.makeGoodText3.text = savedMorningTextData.makeGoodTextData3 83 84 } 85 } 86 87// 保存ボタンの処理 88 @IBAction func morningTextSaveButton(_ sender: UIButton) { 89 let title = "朝の日記の保存" 90 let message = "朝の日記が保存されました" 91 let okText = "OK" 92 93 let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert) 94 let okayButton = UIAlertAction(title: okText, style: UIAlertAction.Style.cancel, handler: nil) 95 alert.addAction(okayButton) 96 97 present(alert, animated: true, completion: nil) 98 99 let realm = try! Realm() 100 print(Realm.Configuration.defaultConfiguration.fileURL!) 101 let addMorningText = MorningTextData() 102 addMorningText.date = dateResult 103 addMorningText.appreciationTextData1 = appreciationText1.text ?? "" 104 addMorningText.appreciationTextData2 = appreciationText2.text ?? "" 105 addMorningText.appreciationTextData3 = appreciationText3.text ?? "" 106 addMorningText.makeGoodTextData1 = makeGoodText1.text ?? "" 107 addMorningText.makeGoodTextData2 = makeGoodText2.text ?? "" 108 addMorningText.makeGoodTextData3 = makeGoodText3.text ?? "" 109 110 try! realm.write() { 111 realm.add(addMorningText, update: .all) 112 } 113 } 114 115// 画面を移る時の処理 116 override func viewWillDisappear(_ animated: Bool) { 117 super.viewWillDisappear(animated) 118 NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil) 119 NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) 120 } 121} 122 123
試したこと
テキストフィールドのy座標を取得して、キーボードとかぶる場合のみ差分viewを持ち上げる様書いたつもりです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー