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

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

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

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

Q&A

解決済

1回答

1943閲覧

UITableviewCell内に配置したUITextViewにフォーカスした時の画面のスクロール量について

pftyuk

総合スコア52

Swift

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

0グッド

0クリップ

投稿2019/02/02 06:04

編集2019/02/05 13:23

前提・実現したいこと

xibでUITextViewを配置したセルを作りました。
セル内のUITextViewをフォーカスした時に、UITextView部分がキーボードで隠れてしまわないように
こちらを参考に画面をずらすこと自体は出来ているのですが、スクロール量についてお伺いしたいです。

以下に画面の写真を添付させて頂いております。
前提として、レイアウトはこの画面に遷移してきた時に決まるので
写真の画面から動的にセルの数が増えたり減ったりすることはありません。

前の画面からのデータを元に、ゴミの日のセクションのセルの数が1~4の数になります。
この画面での、メモを入力の部分がUITextViewになっているのですが
この部分にフォーカスしたときの、画面のスクロール量の決め方をご教示頂きたいです。

現在は取り敢えず決め打ちで、画面全体の高さに対して半分の高さを
上にずらしているので、ゴミの日のセクションのセルの数が1つのときは
なんとなく良さそうな位置までスクロールしているのですが、2つのときは
不燃のセルが見えてしまっています。

望む状態としては、ゴミの日のセクションのセルの数に関係なく
UITextViewにフォーカスした時には、メモのセクションが一番上に来る状態(写真3枚目)に
スクロールするようにしたいです。

伝わりにくい部分があるかもしれませんが、ご教示頂ければ幸いです。
宜しくお願い致します。

アプリの画面

該当のソースコード

Swift

1// Notificationを設定 2 func configureObserver() { 3 let notification = NotificationCenter.default 4 notification.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) 5 notification.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil) 6 } 7 8 // Notificationを削除 9 func removeObserver() { 10 let notification = NotificationCenter.default 11 notification.removeObserver(self) 12 } 13 14 // キーボードが現れた時に、画面全体をずらす。 15 @objc func keyboardWillShow(notification: Notification?) { 16 let rect = (notification?.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue 17 let duration: TimeInterval? = notification?.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double 18 //画面に対して画面の半分の高さを決め打ちしてしまっている 19 let height = -(rect?.size.height)! / 2.0 20 UIView.animate(withDuration: duration!, animations: { () in 21 let transform = CGAffineTransform(translationX: 0, y: height) 22 self.view.transform = transform 23 }) 24 } 25 26 // キーボードが消えたときに、画面を戻す 27 @objc func keyboardWillHide(notification: Notification?) { 28 let duration: TimeInterval? = notification?.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? Double 29 UIView.animate(withDuration: duration!, animations: { () in 30 31 self.view.transform = CGAffineTransform.identity 32 }) 33 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

セルの数が増えれば、その分メモの表示位置が下に来るのだから、セル数に関わらずメモの位置を画面先頭付近まで移動したいのであれば、セルの数xセルの高さの分、今の heightから減算すればよいと思います。

投稿2019/02/03 16:27

TakeOne

総合スコア6299

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

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

pftyuk

2019/02/04 03:49

ご回答頂きありがとうございます。 何点か教えて下さい。 ゴミの日のセクションのセルの数とセルの高さを取得すれば良さそうですが セクション単位でのセルの数の取得と高さの取得は可能なのでしょうか? 手元で調べて取得方法がわからなかったので 恐縮ですがご教示頂きたいです。 また今のheightからとのことですが 画面全体のheightの認識で合ってますでしょうか?
TakeOne

2019/02/04 04:04 編集

「前の画面からのデータを元に、ゴミの日のセクションのセルの数が1~4の数になります。」と言っているのだから、前の画面から引き継ぎがれたデータを見れば、表示しているセルの数はわかるのではないですか? セルの高さは、Storyboardかxibに定義したセルの内容を見ればわかるのではないですか? 「今のheightから」というのは「let height = -(rect?.size.height)! / 2.0」で計算した変数の「height」を指しています。そのheightをさらに「セルの数xセルの高さ」分減算すればいいという意味です。
pftyuk

2019/02/04 04:09

返信ありがとうございます。 仰る通りでした…トンチンカンな質問失礼しました。 heightについて理解しました。 手元で試して確認してみます。
pftyuk

2019/02/04 12:43

試してみたのですが、かなり上の方までスクロールされてしまいました。 セルの数が1・2の時のパターンのものを写真追加しましたのでご確認頂ければ幸いです。 試したコードですが @objc func keyboardWillShow(notification: Notification?) { let rect = (notification?.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue let duration: TimeInterval? = notification?.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double let hh = CGFloat(66 * items.count)//セルの高さ * セルの数 let height = (-(rect?.size.height)!/2.0) - hh UIView.animate(withDuration: duration!, animations: { () in let transform = CGAffineTransform(translationX: 0, y: height) self.view.transform = transform }) } セルの高さとセルの数をかけたものを引いてみました。 items.countがセルの数で間違い無いのですが セルの高さの決まり方がいまいち理解ができておらず、storyboard上で 該当のセルのRow Heightが66だったので、66で決め打ちして試してみたのですが そもそもセルの高さが違うのでしょうか・・・。 自分で書いておいて後から気付いたのですが (-(rect?.size.height)!/2.0)がキーボードの半分の高さで そこからさらにセルの高さ*セルの数の高さを減算したらもちろんかなり上に スクロールされてしまうのではないかなと思っているのですがどうでしょうか?
TakeOne

2019/02/04 15:31

セルの個数が1個の時にもともとのheightの値で丁度よかったんだから、hhの計算式は let hh = CGFloat(66 * (items.count - 1))ですよね。 セルの高さは66決め打ちでよさそうに思います。
pftyuk

2019/02/05 12:59

返信ありがとうございます。 仰る通りitems.count-1でしたね・・・。 試してみたら、無事いい感じにスクロールされるようになりました! この度はありがとうございました!ベストアンサーとさせて頂き閉じさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問