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

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

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

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

Swift

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

Q&A

解決済

1回答

2036閲覧

スクロールビューのcontentOffset.xの値がずっと0【Xcode12.0.1】

Zhalen

総合スコア2

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/10/03 00:47

編集2020/10/06 00:46

前提・実現したいこと

前提:
・ScrollViewの横スクロールにおいて、増減するはずのscrollView.contentOffset.xの値がずっと0のままである。
・ストーリボードを最小限しか使わず、ほぼ全てSnapKitによるセットアップをしている。そうではない場合(オートレイアウトを使う場合)、値はちゃんと増減する。

実現したいこと:上記を改善したい。

イメージ説明

このように、横にスクロールしているのにもかかわらずプリントされるのは0である。

該当のソースコード(必要最低限)

Declarations

1import UIKit 2 3let width = UIScreen.main.bounds.width 4let height = UIScreen.main.bounds.height

FirstViewController

1import UIKit 2import SnapKit 3 4//MARK:- Class_ViewController 5class FirstViewController: UIViewController { 6 7 let horizontalScrollView = UIScrollView() 8 let superStackView = UIView() 9 let stackView = UIStackView() 10 var tableViews = [UITableView]() 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 setUpViews() 16 } 17 18 //MARK: View 19 private func setUpViews() { 20 //addViews 21 view.addSubview(horizontalScrollView) 22 horizontalScrollView.addSubview(superStackView) 23 superStackView.addSubview(stackView) 24 for _ in 0..<4 { 25 let tableView = UITableView() 26 tableViews.append(tableView) 27 stackView.addArrangedSubview(tableView) 28 } 29 30 //setUpConstrains 31 view.frame.size = CGSize(width: width * 4, height: height) 32 horizontalScrollView.snp.makeConstraints { make in 33 make.width.equalToSuperview() 34 make.height.equalToSuperview() 35 make.edges.equalToSuperview() 36 } 37 [superStackView, stackView].forEach { 38 $0?.snp.makeConstraints { make in 39 make.height.equalToSuperview() 40 make.edges.equalToSuperview() 41 } 42 } 43 tableViews.forEach { 44 $0.snp.makeConstraints { make in 45 make.width.equalTo(horizontalScrollView.snp.width) 46 make.top.equalTo(300) 47 } 48 } 49 50 //MARK: setUpInspetors 51 horizontalScrollView.backgroundColor = .black 52 horizontalScrollView.isPagingEnabled = true 53 superStackView.backgroundColor = .darkGray 54 stackView.backgroundColor = .gray 55 stackView.axis = .horizontal 56 stackView.alignment = .fill 57 stackView.distribution = .fillEqually 58 tableViews.forEach { 59 $0.delegate = self 60 $0.dataSource = self 61 $0.backgroundColor = .lightGray 62 } 63 } 64} 65 66//MARK:- Extension_UITableView 67extension FirstViewController: UITableViewDelegate, UITableViewDataSource { 68 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 69 return 100 70 } 71 72 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 73 return 100 74 } 75 76 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 77 let cell = UITableViewCell(style: .default, reuseIdentifier: nil) 78 79 let text = ["????","????","????","????","????","????","????","????","????"][Int(arc4random() % 9)] 80 cell.textLabel?.text = text 81 cell.backgroundColor = .white 82 83 return cell 84 } 85 86 func scrollViewDidScroll(_ scrollView: UIScrollView) { 87 88 //ここのプリントで、xがずっと0のまま出力される 89 print(scrollView.contentOffset) 90 91 if (scrollView == self.horizontalScrollView) { 92 //また、scrollView がなぜか決して horizontalScrollView にならない(IBフル使用時はちゃんとなる) 93 horizontalScrollHyps(scrollView) 94 } 95 else { 96 verticalScrollHyps(scrollView) 97 } 98 } 99 100 private func horizontalScrollHyps(_ scrollView: UIScrollView) { 101 //横スクロールでの処理 102 } 103 104 private func verticalScrollHyps(_ scrollView: UIScrollView) { 105 //縦スクロールでの処理 106 } 107}

やっていることは

スクロールビューの上にスタックビューの土台を乗せる
スタックビューの土台の上にスタックビューを乗せる
スタックビューの上にテーブルビューを乗せる

というのと、それらのConstraintの設定です。これをStoryboardを使用した場合で(AutoLayout以外を)表現するとこうなります。

イメージ説明

このStoryBoard版だと、普通に問題はありません。

試したこと

・諸々の再起動
・Constraintの複数パターンでの再設定
translatesAutoresizingMaskIntoConstraintsをtrueにしたりfalseにしたりした。ただ、trueにすると余計ぐちゃぐちゃになるのでやめた。

その他、Googleで調べ続け細かい補正などを一ヶ月近くやって悉く失敗。
回答よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

MacOS Catalina バージョン10.15.6
Xcode12.0.1

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

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

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

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

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

tsuki01

2020/10/03 15:12

提示されているコードのままですといくつかエラーが発生したり、検証に必要な処理が足りて無い気がするのですがいかがでしょうか。 以下の点を修正して頂けると回答が付きやすくなるかと思いますので、対応のほどご検討ください。 ・31行目:「width、height」 の定義が不足している(エラー発生) ・46行目:「profileView」 の定義が不足している(エラー発生) ・ScrollViewのDelegate設定が不足している(スクロール後のデバッグとして必要ではないか) ・「scrollView.contentOffset.x」の値を確認する際は、どこのイベントでログ出力して確認しているか?(ログ出力の処理も追加した方が良いかと思います)
Zhalen

2020/10/04 02:21

はい、すいません。見落としでした????????‍♂️ 間もなく修正致します。
tsuki01

2020/10/04 04:53 編集

修正ありがとうございました。更に以下を追記して実行してみたら「contentOffset.x」の値が問題なく出力されておりました。こちらの確認方法が誤っていたら申し訳ありませんが、共有いたします(コメント内の"horizontalScrollView にならない"に関しても動作していた) ・追記処理  UIScrollViewDelegateプロトコルの追加  horizontalScrollViewに対するDelegate指定 ・こちらの検証環境  Xcode11.2.1 + iPhone11ProMaxシミュレータ
Zhalen

2020/10/04 05:09

うああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああアアアアアアアアアア!!!!!!!!!!!!!!!!!!!!(欣喜雀躍) 正常に動作しました! もしかしたらストーリーボードを使う場合、スクロールビューを配置した時点でUIScrollViewDelegateが自動で組み込まれてたからその違いに気づけなかったんだと思いました。 はアアアアアアアアアアああ!!!!!!!! 間接的ではありますが(恐らく)命を救って頂き誠に感謝いたします! 感謝! 謝謝! Gracias!!! ????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️????????‍♂️
guest

回答1

0

自己解決

tsuki01様のおかげで、無事解決することができました! 本当にありがとうございます! 

【改善方法】
1、エクステンションで以下を記述する。

FirstViewController

1extension FirstViewController: UIScrollViewDelegate { 2 //中身は何もなくてよい 3}

2、スクロールビューをデリゲートさせる。(今回の場合はhorizontalScrollView

FirstViewController

1 //MARK: setUpInspetors 2 horizontalScrollView.delegate = self //ここを追加 3 (以下略) 4

3、起動
イメージ説明

【考えられる原因】
恐らく、Interface Builder(Storyboard)を使ってスクロールビューを配置した時点で、UIScrollViewDelegateが組み込まれている。これは他のいくつかのViewに関しても同様なものがあると思われる。Googleでいくら調べてもこんな事書いてなかったぞ……
もしかしたら上級者の方からすれば自明な事だったかも知れませんが、また新たな知識を得ることができました。

再三になりますが、本当にtsuki01様ありがとうございました!

投稿2020/10/04 05:13

Zhalen

総合スコア2

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

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

tsuki01

2020/10/04 11:29

無事に動作するようになったとのことで良かったです。 私も正確に理解していないのですが、以下の点だけ異なるかと思うので補足させて頂きます。 >恐らく、Interface Builder(Storyboard)を使ってスクロールビューを配置した時点で、>UIScrollViewDelegateが組み込まれている。 こちらに関してですが、自動でDelegateが組み込まれることは無い(はずです。。) TableView自体がScrollViewを継承しているので、TableViewDelegate側でScrollViewのDelegateを拾ってくれているのかもしれません。 実際、「UIScrollViewDelegate」を追加しなくても「func scrollViewDidScroll(_ scrollView: UIScrollView)」が呼ばれることを確認できました。 ※曖昧なコメントとなってしまったので、「そうなんだ」程度に流して頂けると幸いです。
Zhalen

2020/10/05 00:22

そうだったのですね。そうか...テーブルビューに継承されているのならば、やはりなぜストーリーボードを使わなくなっただけでこのような差異が出るのか本当に分からないですね。うーむ......謎だ。 それかもしかしたら単に私自身のミスで、今回のSnapKit使用版で新しくプロジェクトを書き上げていった際に以前付け加えていたはずの微細な因子を見逃してしまっていたのかも知れません。厳密に精査しながら絶対に違いが出ないようにやっていた為こちらも考えにくいですが、今後、状況が判明次第逐次追記していくと思います。 コメントありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問