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

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

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

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

3463閲覧

XcodeでScroll View自身とScrollVIew内の部品にAuto Layoutを適用させたい。

Tommy716

総合スコア22

iPad

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2018/08/13 08:59

編集2018/08/14 09:18

XcodeでScroll View自身とScrollVIew内の部品にAuto Layoutを適用させたいです。
いつも通り、Scroll View内の部品に制約をつけるとビルドした時に真っ白になってしまします。何か方法はありますか?

具体的にしたいこととしては、text Fieldを編集するときにtext FIeldが隠れないようにしたいです。
コードは参考サイトと全く同じように書きました。

参考サイト

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet weak var scrollview: UIScrollView! 5 @IBOutlet weak var textView: UITextField! 6 @IBOutlet weak var label: UILabel! 7 @IBOutlet weak var orange: UIView! 8 9 var screenHeight:CGFloat! 10 // Screenの幅 11 var screenWidth:CGFloat! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 scrollview.delegate = (self as? UIScrollViewDelegate) 17 textView.delegate = self as? UITextFieldDelegate 18 // Do any additional setup after loading the view, typically from a nib. 19 20 let screenSize: CGRect = UIScreen.main.bounds 21 screenWidth = screenSize.width 22 screenHeight = screenSize.height 23 scrollview.frame.size = 24 CGSize(width: screenWidth, height: screenHeight) 25 scrollview.addSubview(orange) 26 scrollview.addSubview(label) 27 scrollview.addSubview(textView) 28 scrollview.contentSize = CGSize(width: screenWidth, height: screenHeight*2) 29 scrollview.bounces = false 30 print("screenWidth:(screenWidth)") 31 print("screenHeight:(screenHeight)") 32 33 } 34 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 35 self.view.endEditing(true) 36 return true 37 } 38 39 override func viewWillAppear(_ animated: Bool) { 40 super.viewWillAppear(animated) 41 42 NotificationCenter.default.addObserver(self, 43 selector: #selector(ViewController.keyboardWillShow(_:)), 44 name: NSNotification.Name.UIKeyboardWillShow, 45 object: nil) 46 NotificationCenter.default.addObserver(self, 47 selector: #selector(ViewController.keyboardWillHide(_:)) , 48 name: NSNotification.Name.UIKeyboardWillHide, 49 object: nil) 50 } 51 52 override func viewWillDisappear(_ animated: Bool) { 53 super.viewWillDisappear(animated) 54 55 NotificationCenter.default.removeObserver(self, 56 name: .UIKeyboardWillShow, 57 object: self.view.window) 58 NotificationCenter.default.removeObserver(self, 59 name: .UIKeyboardDidHide, 60 object: self.view.window) 61 } 62 63 @objc func keyboardWillShow(_ notification: Notification) { 64 65 let info = notification.userInfo! 66 67 let keyboardFrame = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue 68 69 // bottom of textField 70 let bottomTextField = textView.frame.origin.y + textView.frame.height 71 // top of keyboard 72 let topKeyboard = screenHeight - keyboardFrame.size.height 73 // 重なり 74 let distance = bottomTextField - topKeyboard 75 76 if distance >= 0 { 77 // scrollViewのコンテツを上へオフセット + 20.0(追加のオフセット) 78 scrollview.contentOffset.y = distance + 20.0 79 } 80 } 81 82 @objc func keyboardWillHide(_ notification: Notification) { 83 scrollview.contentOffset.y = 0 84 } 85 86 override func didReceiveMemoryWarning() { 87 super.didReceiveMemoryWarning() 88 // Dispose of any resources that can be recreated. 89 } 90 91 92} 93 94

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

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

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

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

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

t_obara

2018/08/13 10:06

問題が発生する、あるいはうまく動作しない最小限のコードをご提示されると回答がつきやすくなると思いますよ。
Tommy716

2018/08/13 10:12

言葉不足ですみません。参考サイトと全く同じようにやりました。
xAxis

2018/08/14 03:36

全く同じじゃないから機能してないんじゃないかと。参考サイトのコードを読む限り問題はないですし。
Tommy716

2018/08/14 09:17

申し訳ないです。コードを追加しました
xAxis

2018/08/14 09:50

参考サイトのコードに問題ないとか抜かしてしまいましたが問題ありですね。すいません。
t_obara

2018/08/14 10:13

部品の制約はstoryboardで行ったのでしょうか?制約を外すと期待通り動作するのでしょうか?
Tommy716

2018/08/14 10:15

xAxis様 いえいえ全然大丈夫です。
Tommy716

2018/08/14 10:17

t_obara様 制約はstoryboard上で行いました。制約を外すと、期待通り動作するのですが、iPadやiPhoneXなどでは変な余白が出てしまいそれを治したいと思っています。
t_obara

2018/08/14 10:53

であれば、どの様な制約をつけたのかもご提示されると回答が得られやすいのではないでしょうか。https://virusee.net/hidden-ios-keyboard/ ちなみに、こちらで同様のことをされていますが、うまく動作するのかはわかりません。
guest

回答1

0

ベストアンサー

まずDelegateが必要ならばAuto Layout以前にクラス名のとなりにUIScrollViewDelegateUITextFieldDelegateを書きましょう。

swift

1class ViewController: UIViewController, UIScrollViewDelegate, UITextFieldDelegate {

んで、viewDidLoad()内の

swift

1scrollview.delegate = (self as? UIScrollViewDelegate) 2textView.delegate = self as? UITextFieldDelegate

swift

1scrollview.delegate = self 2textView.delegate = self

としましょう。

UIScrollViewとその他パーツをAuto Layoutで設定するには

ここからが本題です。
サイトではUIScrollView等UIをコードで生成、設定している様ですがAuto Layoutだけで作ることも可能です。よくやるのがUIScrollViewの子ViewにUIViewを設定してそいつをContent Viewとするやり方です。UITableViewCellとその中のContent Viewと同じ様な関係ですね。今回は上下にスクロールするやり方です。

  1. UIScrollViewと子ViewであるUIView(Content View)共にconstraintsを上下左右0に設定。
  2. ContentViewであるUIViewのwidthをViewController.viewとequalに設定。
  3. ContentViewの高さはお好みで。ただしUIScrollViewのheight以上の高さを設定する必要がある。
  4. 後はContentViewに必要なUILabelやUISlider、UITextField、UIButton等をのせて各々に制約をつけていく。
  5. 完成

UIScrollViewは子Viewが自身の領域外にある場合、スクロールできる様になっています。逆にUIScrollViewと子Viewが全く同一の制約を持った場合スクロールしません。なのでContentViewのheightは必ずUIScrollViewのheight以上にしましょう。

参考に画像を載せておきます。

この画像ではUIScrollViewにUIView(Content View)をのせ、Content ViewにUILabel、UISlider、UITextField、UIButtonを載せています(UIButtonはContentViewのbottom+16に設定しているので見えません)。サイトの構成に似せるためにContentViewのheightはUIScrollViewのheightの倍になっています。

親子関係

ViewController

さて、サイトに乗っているコードの何が気になるかというとIBOutlet接続されたscrollViewにIBOutlet接続されたUI群をaddSubViewしているところです。本来Storyboardに配置された時点でほぼaddSubViewしている様なもののはずが再度addSubViewするのはおかしいのではないかと思い上記の様なコメントをしました。ただしこの辺りは自分も解釈があやふやな部分もあるためおかしな所がありましたらご教授いただけると幸いです。

参考程度のコードを一応貼っておきます。細かいところまでは大して読んでいないので本当に参考程度ですが。

swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 @IBOutlet var scrollView: UIScrollView! 7 @IBOutlet var textField: UITextField! 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view, typically from a nib. 11 } 12 13 override func didReceiveMemoryWarning() { 14 super.didReceiveMemoryWarning() 15 // Dispose of any resources that can be recreated. 16 } 17 18 override func viewWillAppear(_ animated: Bool) { 19 super.viewWillAppear(animated) 20 21 NotificationCenter.default.addObserver(self, 22 selector: #selector(ViewController.keyboardWillShow(_:)), 23 name: NSNotification.Name.UIKeyboardWillShow, 24 object: nil) 25 NotificationCenter.default.addObserver(self, 26 selector: #selector(ViewController.keyboardWillHide(_:)) , 27 name: NSNotification.Name.UIKeyboardWillHide, 28 object: nil) 29 } 30 31 override func viewWillDisappear(_ animated: Bool) { 32 super.viewWillDisappear(animated) 33 34 NotificationCenter.default.removeObserver(self, 35 name: .UIKeyboardWillShow, 36 object: self.view.window) 37 NotificationCenter.default.removeObserver(self, 38 name: .UIKeyboardDidHide, 39 object: self.view.window) 40 } 41 @objc func keyboardWillShow(_ notification: Notification) { 42 43 let info = notification.userInfo! 44 45 let keyboardFrame = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue 46 47 // bottom of textField 48 let bottomTextField = textField.frame.origin.y + textField.frame.height 49 // top of keyboard 50 let topKeyboard = UIScreen.main.bounds.height - keyboardFrame.size.height 51 // 重なり 52 let distance = bottomTextField - topKeyboard 53 54 if distance >= 0 { 55 // scrollViewのコンテツを上へオフセット + 20.0(追加のオフセット) 56 scrollView.contentOffset.y = distance + 20.0 57 } 58 } 59 60 @objc func keyboardWillHide(_ notification: Notification) { 61 scrollView.contentOffset.y = 0 62 } 63 64} 65

投稿2018/08/14 10:52

xAxis

総合スコア1349

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

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

Tommy716

2018/08/16 05:12

できました!ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問