web-dev-qa-db-ja.com

AutoLayoutを使用したUIScrollView内のUITextView

AutoLayoutを使用してUITextViewをUIScrollView内に配置しようとしています。私が試したのは、

  • ストーリーボードのメインビュー内にUIScrollViewを配置しました
  • ストーリーボードのUIScrollView内にUITextViewを配置し、スクロール有効を無効にしました
  • UIScrollViewに制約(先頭、末尾、上部、下部)を設定します
  • UITextViewに制約(上部、先頭、末尾、高さ)を設定します
  • UITextViewの高さ制約のIBOutletを作成しました
  • ViewDidLoad()のUITextViewにテキスト(スクロールを引き起こす可能性のある多くのテキスト)を設定します
  • 次のコードでUITextViewの高さの制約を設定します。 viewDidLoad()およびviewDidLayoutSubviews()でテキストを設定した直後に、運がなかったので試してみました

self.textViewHeightConstraint.constant = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, FLT_MAX)].height;

UITextViewは高さを取得していますが、UIScrollViewはそうではありません。見逃したことはありますか?

29

数日間の調査と、UIScrollView + UITextView + Auto Layoutで手を汚した後、UIScrollViewが完全に機能するようになりました。誰かが同じ状況に陥る可能性がある場合に備えて、ソリューションを共有したいと思います。

  1. Storyboardのメインビュー内にUIScrollViewを追加します
  2. UIScrollView内にUIViewを追加します
  3. UIView内にUITextViewを追加します(手順2で追加したビュー)
  4. UITextViewの「スクロール有効」がオフになっていることを確認します
  5. UIScrollViewに4つの制約(先頭、末尾、上部、下部)を追加します
  6. UIView(ステップ2で追加したビュー)に4つの制約(先頭、末尾、上部、下部)を追加します
  7. UIView(ステップ2で追加されたビュー)およびメインビューに「Width Equally」制約を追加します
  8. UITextViewに5つの制約(先頭、末尾、上部、下部、高さ)を追加します。この手順の後、制約に関するエラーや警告は表示されません。
  9. UIControllerの高さ制約IBOutletをViewControllerに追加します。 @property (nonatomic, weak) IBOutlet NSLayoutConstraint *textViewHeightConstraint;およびStoryboardで接続します
  10. UITextViewの高さの制約をプログラムで変更します。 self.textViewHeightConstraint.constant = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, CGFLOAT_MAX)].height;

これらの10の手順をすべて実行すると、UITextViewを内部に備えたUIScrollViewが完全に機能し、満足します。

77

この質問には、多くの人にとって有効な答えがあるようです。ただし、 documentation の状態に注意する必要があります。

スクロールビュー内にテキストビューを配置します。テキストビューは独自のスクロールを処理します。スクロールビューにテキストビューオブジェクトを埋め込まないでください。そうすると、2つのオブジェクトのタッチイベントが混同され、誤って処理される可能性があるため、予期しない動作が発生する可能性があります。

UITextViewUIScrollViewを配置する前に、これが本当に必要かどうかを検討する必要があります。テキストビューがスクロールビュー内の複雑なレイアウトの一部である場合、受け入れられた回答のUIViewコンテナの使用に注意してください。

参照: スクロールビュー内のスクロールビュー

7
Suragch

自動レイアウトがまだUIScrollView-の高さについて不平を言っていることに気づいた場合

ここでの問題は、UITextViewがデフォルトでIBの「Scrolling Enabled」をチェックしていることです。

そのため、そのチェックボックスを見つけてチェックを外します。

enter image description here

3
Vitya Shurapov

私はUITextViewの動的な高さの高さを計算する方法の実用的な例を持っています+それはUIScrollViewの中にあるUIStackViewの中にあります: https://github.com/fassko/ScrollStackViewExample

1

上記のソドビレグのソリューションは機能しますが、彼のすべての手順が必要なわけではありません。彼のステップ7までの手順に従って、スクロールビューでテキストビューをスクロールしました。ステップ8では、4つの制約を追加しましたが、高さは追加しませんでした(下部の制約を忘れないでください!!)。残りはしませんでした。

よくわかりませんが、textviewの高さは手動で変更する代わりに自動的に調整されるようです。

0