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

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

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

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

Q&A

解決済

1回答

826閲覧

UIScrollViewがオートレイアウトでスクロールしなくなる現象についてです。

Hayato1201

総合スコア220

Swift

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

0グッド

0クリップ

投稿2019/03/15 04:43

編集2019/03/15 10:04

UIScrollViewの上にviewを追加して、そのviewにオートレイアウトで制約をつけるとそのサブビュー自体表示されず、かつScrollViewもスクロールしない状態になってしまいます。。。以下の様にオートレイアウトにはTinyConstraintsを使っています。

Swift

1import UIKit 2import TinyConstraints 3 4final class Hoge: UIViewController { 5 6 let textEditer = UITextView() 7 let scrview = UIScrollView() 8override func viewDidLoad() { 9 super.viewDidLoad() 10 11 self.view.addSubview(scrview) 12 13 self.scrview.addSubview(textEditer) 14 15 } 16override func viewDidLayoutSubviews(){ 17 super.viewDidLayoutSubviews() 18 19 scrview.scrollIndicatorInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 20 scrview.contentSize = CGSize(width: 300, height: 1400) 21 scrview.edgesToSuperview() 22 23 24// textEditer.frame = CGRect(x: 0, y: self.scrview.frame.height - 500, width: self.view.frame.width, height: 500) <ーこっちは動く 25//⬇︎これだとスクロールしなくなる。 26// textEditer.leftToSuperview() 27// textEditer.rightToSuperview() 28// textEditer.topToSuperview(offset:300) 29// textEditer.height(300) 30 31 } 32}

上のコードのコメントアウトを外すとスクロールしなくなります。これは何が原因でしょうか?因みにtextEditer.frame で指定すると普通にスクロールできてtextEditerも表示されます。

追記です。
scrview.edgesToSuperview()でスクロールビューの制約をつけて、UITextViewの方はframe=で設定した場合はスクロールはするけどUITextViewが表示されません。両方制約をつけないでframe=で行うとスクロールもできてUITextViewも表示されます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

bottomの制約が無いからではないでしょうか?
contentSize.heightを1400にしたいのであれば、

swift

1textEditer.bottomToSuperview(offset:800) //1400 - 300 - 300

のような感じでどうでしょうか?
(TinyConstraintsは使ったことがないので、おかしいところは修正して下さい)

また、TextViewの幅の制約がないので追加して下さい。【追記】

なお、contentSizeはAutolayoutで自動的に設定されるはずなので、自分で書く必要はないと思います。

投稿2019/03/15 04:56

編集2019/03/18 02:32
fuzzball

総合スコア16731

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

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

Hayato1201

2019/03/15 09:49

回答ありがとうございます。 contentSizeを書く必要が無いとの事ですが、以下の scrview.contentSize = CGSize(width: 300, height: 1400) をコメントアウトするとその時点でスクロールしなくなります。。。またやはりbottomの制約をつけてもスクロールしませんでした。またtextEditerも表示されません、、、
fuzzball

2019/03/15 10:00 編集

あぁ、よく見たらscrollViewのサイズが設定されてないですね。storyboardで設定してるのかとは思ってました。
Hayato1201

2019/03/15 10:14

返信ありがとうございます。 scrview.edgesToSuperview()でエッジを親ビューに合わているためscrollViewのサイズの設定は必要のないのかと思ったのですがどうなんでしょうか?また実際scrviewのサイズはscrview.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)で指定しても.edgesToSuperview()を使っても同じ様なものだと思うのですが、とにかくサブビューで制約を追加するとスクロールしなくなってそのサブビューも表示されません。。。
fuzzball

2019/03/15 10:20

なるほど、edgesToSuperview()は四辺を合わせてくれるんですね。 あとは、実際に付いている制約が、思っているように付いているかどうか確認する、とかでしょうか。
fuzzball

2019/03/15 10:23 編集

もう一つ、制約を付けるのはviewDidLoad()の方がいいと思うんですけど、そこでやっている理由はありますか?
Hayato1201

2019/03/15 10:39

レイアウト関連はLayoutSubviewsで一括して行った方が見やすくなるという事や結局オートレイアウトが反映されるのはviewDidLayoutSubviewsの中だからそこで行って問題ないと思ったのでそうしたのですが、結局今の処理をviewDidLoad()で行っても同じ様に動きませんでした。 参考までにTinyConstraintsの使い方で参考にしているサイトです。。。 https://qiita.com/sakiyamaK/items/bf15a78de3f951a0e6e9
fuzzball

2019/03/15 10:51

まぁ、実際に付いている制約を調べて書き出すか、storyboardを使って同様の症状を再現してもらわないと、TinyConstraintsを使っていない私にはこれ以上の対応は無理そうです。 あと、viewDidLayoutSubviewsはレイアウトが終わったときに呼び出されます。何度も呼ばれる可能性があるのはご存知でしょうか?
fuzzball

2019/03/18 02:32

TextViewの幅の制約を追加して下さい。(回答にも追記しました)
Hayato1201

2019/03/18 03:35

回答ありがとうございました。 結局うまくいかなかったので画面サイズを基準に割合でサイズを指定してレイアウトを作りました。
fuzzball

2019/03/18 04:00

幅の制約を追加してもうまくいかなかったのでしょうか? それとも、その前に別のやり方で実装したということでしょうか?
Hayato1201

2019/03/18 04:30

幅の制約の前にもう画面サイズからの割合で指定する方で作ってしまっていました。
Hayato1201

2019/03/18 04:31

ただ幅の制約は textEditer.leftToSuperview() textEditer.rightToSuperview() でそれぞれ親ビューのエッジに合わせられていたのだと思っていました。
fuzzball

2019/03/18 04:53 編集

それに加えて、 TextView.center = superview.center もしくは TextView.width = superview.width の制約が必要です。 ScrollViewの制約は特殊なので、理解出来ていないのであれば、Storyaboardで作ってコードに落とし込むなどした方がいいと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問