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

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

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

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

Swift

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

Q&A

0回答

1418閲覧

UIScrollViewの中身のオブジェクトのコードでの制約について

gomugomu

総合スコア6

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/04/17 18:44

前提・実現したいこと

UIScrollViewの上に、viewやtableViewなどをコードで配置したいです。
今回はレイアウトを指定する際に、SnapKitと言う有名なpodを使用しました。
ただ、スナップキットを使用して、scrollView上のオブジェクト(今回はviewとtableView)の制約を決定したのですが、なぜかうまく動きません。
教えていただけるとありがたいです。よろしくお願いします。

該当のソースコード

Swift

1import UIKit 2import SnapKit 3 4class ViewController: UIViewController { 5 6 @IBOutlet weak var scrollView: UIScrollView! 7 @IBOutlet weak var baseView: UIView! 8 @IBOutlet weak var tableView: UITableView! 9 @IBOutlet weak var profileView: UIView! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 scrollView.delegate = self 14 tableView.delegate = self 15 tableView.dataSource = self 16 SNPLayout() 17 setScrollView() 18 self.view.addSubview(scrollView) 19 } 20 21 func setScrollView() { 22 self.scrollView.contentSize = CGSize(width: self.view.frame.size.width, height: 1000) 23 self.scrollView.addSubview(baseView) 24 self.scrollView.addSubview(tableView) 25 } 26 27 func SNPLayout() { 28 scrollView.snp.makeConstraints { make in 29 make.center.equalToSuperview() 30 make.left.equalToSuperview() 31 make.right.equalToSuperview() 32 make.top.equalToSuperview() 33 make.bottom.equalToSuperview() 34 } 35 baseView.snp.makeConstraints { make in 36 make.left.equalTo(scrollView.snp.left) 37 make.top.equalTo(scrollView.snp.top) 38 make.right.equalTo(scrollView.snp.right) 39 make.height.equalTo(207) 40 } 41 tableView.snp.makeConstraints { make in 42 make.left.equalTo(scrollView.snp.left) 43 make.right.equalTo(scrollView.snp.right) 44 make.top.equalTo(baseView.snp.bottom) 45 make.bottom.equalTo(scrollView.snp.bottom) 46 } 47 profileView.snp.makeConstraints { make in 48 make.left.equalTo(scrollView.snp.left).offset(20) 49 make.top.equalTo(scrollView.snp.top).offset(20) 50 make.size.equalTo(40) 51 } 52 53 } 54 55 56 57} 58 59//MARK:- UITableviewDeleagte 60extension ViewController: UITableViewDelegate { 61 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 62 return 40 63 } 64} 65 66//MARK:- UITableViewDataSource 67 68extension ViewController: UITableViewDataSource { 69 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 70 return 100 71 } 72 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 73 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 74 return cell 75 76 } 77} 78 79//MARK:- UIScrollViewDelgate 80extension ViewController: UIScrollViewDelegate { 81 func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 82 print("Scroll is starting now!") 83 } 84 85 86} 87

試したこと

ここで、scrollViewの中身のオブジェクト(今回はviewとtableView)の制約をコメントアウトするとしっかりと作動しましたが、それだと当たり前なのですが、他画面対応できないので困っています。

教えていただけると嬉しいです。よろしくお願いします。

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

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

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

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

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

hoshi-takanori

2020/04/20 11:54

scrollView の中身を、scrollView に対して制約をかけてしまったためにスクロールできない (スクロールすれば中身の top が動くので) のでは。
gomugomu

2020/04/21 05:44

なるほど!確かにおっしゃる通りですね、完全にtopが変化するのを失念していました。 では、どのように制約をかければいいのでしょうか?
hoshi-takanori

2020/04/21 06:03

baseView や tableView を別々に scrollView に addSubview するのではなく、共通の view に addSubview して、それに対して制約をかけて scrollView に addSubview すれば良いのでは。
gomugomu

2020/04/21 07:40

できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問