質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

2566閲覧

textViewがタップされた時のみViewをスクロールしたい

ttah

総合スコア35

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/06/02 00:37

編集2019/06/09 03:38

現在Viewの中にtextFieldとtextViewがあります
textViewがタップされたらViewをスクロールさせたいのですが

今のコードでは1度textViewがタッチされると以降textFieldでもviewがスクロールしてしまします。
原因は

swift

1 func isTouch(touches: Set<UITouch>, view:UIView) -> Bool{ 2 for touch: AnyObject in touches { 3 let t: UITouch = touch as! UITouch 4 if t.view?.tag == view.tag { 5 return true 6 } else { 7 return false 8 } 9 } 10 return false 11 }

ここででviewがスクロールする処理が1度解除されると以降textFieldにも適用されてしまうと考えていますが対処の仕方が分からない状態です

swift

1import UIKit 2 3class testViewController: UIViewController, UITextViewDelegate, UIScrollViewDelegate, UITextFieldDelegate { 4 5 6 @IBOutlet weak var textView: UITextView! 7 @IBOutlet weak var textField: UITextField! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 textView.delegate = self 12 textField.delegate = self 13 textView.tag = 123 14 15 } 16 17 18 19 func configureObserver() { 20 21 let notification = NotificationCenter.default 22 23 notification.addObserver( 24 self, 25 selector: #selector(self.keyboardWillShow(notification:)), 26 name: UIResponder.keyboardWillShowNotification, 27 object: nil 28 ) 29 30 notification.addObserver( 31 self, 32 selector: #selector(self.keyboardWillHide(notification:)), 33 name: UIResponder.keyboardWillHideNotification, 34 object: nil 35 ) 36 } 37 38 // Notificationを削除 39 func removeObserver() { 40 NotificationCenter.default.removeObserver(self) 41 } 42 43 44 // キーボードが現れたときにviewをずらす 45 @objc func keyboardWillShow(notification: Notification?) { 46 let rect = (notification?.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue 47 let duration: TimeInterval? = notification?.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double 48 UIView.animate(withDuration: duration!) { 49 self.view.transform = CGAffineTransform(translationX: 0, y: -(rect?.size.height)!) 50 51 } 52 } 53 54 // キーボードが消えたときにviewを戻す 55 @objc func keyboardWillHide(notification: Notification?) { 56 let duration: TimeInterval? = notification?.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? Double 57 UIView.animate(withDuration: duration!) { 58 self.view.transform = CGAffineTransform.identity 59 } 60 } 61 62 63 64 65 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 66 if isTouch(touches: touches, view: textView) { 67 self.configureObserver() 68 69 70 } 71 } 72 73 func isTouch(touches: Set<UITouch>, view:UIView) -> Bool{ 74 for touch: AnyObject in touches { 75 let t: UITouch = touch as! UITouch 76 if t.view?.tag == view.tag { 77 return true 78 } else { 79 return false 80 } 81 } 82 return false 83 } 84 85 86

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

下記コードの追加で自己解決出来ました

func textFieldDidBeginEditing(_ textField: UITextField) {
removeObserver()
}

投稿2019/06/13 13:24

ttah

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttah

2019/06/13 13:40 編集

guest

0

configureObserverが実行された後はKeyboardの通知を受け続けることになるので、textFieldをタップしてキーボードが表示されると通知が届いてviewが移動します。

touchesBeganでconfigureObserverを実行するのではなくviewDidLoadでconfigureObserverを実行しておき、keyboardWillShowとkeyboardWillHideのはじめにおいてtextView.isFirstResponder(textViewがFirst Responderになったか。つまりtextViewがタップされたか)をチェックするとそれらのメソッドでの処理がtextViewのみで動作するようにはなります。

しかしその実装では、textFieldをタップしてキーボードが表示されたままtextViewをタップするとkeyboardWillShowで処理がされないのでviewが移動しません。textView→texField→キーボードを閉じるという流れでも同様にkeyboardWillHideで処理が行われません。この問題に対処するにはおそらくUITextViewDelegateのtextViewDidBeginEditingとtextViewDidEndEditingを実装して少し複雑な処理が必要になると思われます。

投稿2019/06/13 09:21

rizumita

総合スコア84

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttah

2019/06/13 13:30

回答有難うございます。回答の少し前に自己解決出来ました。 せっかく回答頂いたのですが、自己解決を記載したらベストアンサーになってしまいました。申し訳ありません。 しかしrozumita様の回答でより深く理解することができ、勉強になりました。 有難うございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問