95

過去にプログラムで操作することでうまく使用UIScrollViewできましたが、InterfaceBuilderで排他的に設定して機能させるのに問題があります。

iPhoneアプリに簡単な「概要」ページがあります。、UITextViewいくつかのアイコン、および他のアプリへのリンクがあります。これらのビューをすべてに追加しUIScrollView、合計サイズが480を超えるように配置しました。アプリを起動すると、scrollviewには画面に収まるコンテンツのみが表示され、スクロールは表示されません。

これを完全にIBを介して行うことは可能ですか、それともコードを介してcontentSizeを操作する必要がありますか?

4

18 に答える 18

130

UIScrollViewのcontentSizeプロパティを設定するのを忘れました。不思議なことに、InterfaceBuilderからこれを行うことはできません。このスクロールビューを管理するビューコントローラから実行する必要があります。

于 2009-07-16T02:50:02.417 に答える
113

Boby_Wanの答えは私に考えさせられ、InterfaceBuilderからUIScrollViewのcontentSizeを構成するための次の解決策を見つけました。

  1. UIScrollViewストーリーボードシーンでを選択します
  2. IDインスペクターに移動し、新しいユーザー定義ランタイム属性を作成します([+]ボタンをクリックします)
  3. 属性キーパスをに変更しますcontentSize
  4. 属性タイプをに変更しますSize
  5. 次に、を{目的のコンテンツの幅目的のコンテンツの高さ}に設定します。

たとえば、値を{320、920}に設定すると、ユーザーはiPhoneの余分な画面全体を下にスクロールできます。

(私はxcode 4.3.3を使用していますが、プロジェクトのiOS展開ターゲットは5.1です)

これを最初に行ったとき、次のエラーが発生しました。

不正な構成:      4.3MainStoryboard.storyboard
     より前のバージョンのXcodeを使用したサイズタイプのユーザー定義のランタイム属性

このエラーが発生した場合は、簡単に修正できます。プロジェクトナビゲータでストーリーボードを選択し、ファイルインスペクタを起動します。Interface Builderドキュメントセクションを検索/展開すると、開発用のドロップダウンがあります。これがに設定されていることを確認してくださいXcode 4.3

于 2012-06-28T06:26:52.293 に答える
25

自動レイアウト(iOS6 +)を使用すると、設定を回避できますcontentSize。代わりに、次の制約を設定してください。

  1. スクロールビューの上部を一番上の子の上部に固定します。
  2. そして、一番下の子の一番下に一番下を固定します。
于 2013-04-18T22:26:51.057 に答える
18

Interface Builderのみを使用してこれを行うことができ、Identity Inspector(3番目のインスペクタータブ)に移動して、新しいUserDefinedRuntime属性を追加します。

  • キーパス: contentSize
  • タイプ: サイズ
  • 値: {幅、高さ}
于 2012-09-21T09:21:52.010 に答える
14

ストーリーボードUIScrollViewを離れずにスクロールを作成する方法があります。

  1. UIScrollViewストーリーボードでを選択し、サイズインスペクターに移動して、[コンテンツインセット]セクションの[下部]の値(または変更する必要のあるその他の値)をコンテンツ領域の高さに変更します。
  2. 次に、IDインスペクターに移動し、([+]ボタンをクリックして)新しいユーザー定義ランタイム属性を作成し、名前を付けますcontentSize入力するタイプは関係ありません(デフォルト値のままにすることもできます)。

これUIScrollViewで問題なく動作しますが、なぜ2番目のステップが必要なのかわかりません(偶然見つけました)。:(

于 2012-01-27T17:04:16.040 に答える
4

Autolayoutを使用するXcode4.5では、サイズインスペクターにコンテンツインセットセクションがありません。そのため、ユーザー定義のランタイム属性の下に追加する必要があり、正常に機能しました。

「ユーザー定義のランタイム属性」に追加するのは、keyPath == contentInsetで、タイプは「Rect」(UIEdgeInsets、Rectと同じ入力)で、{top、left}、{bottom、right}として定義されます。contentSizeは、スクロールビューウィンドウの領域のみを定義します。contentInsetは、スクロール可能な領域を定義します。

これが同じ状況の誰かに役立つことを願っています。

于 2013-01-16T22:01:03.297 に答える
4

私が過去に使用したアプローチの1つは、スクロールビューをインターフェイスビルダーの含まれているビューからドラッグして、実際のサイズをcontentSizeに設定することです。

Interface Builderについて本質的に明らかではないのは、ペン先に保存されているが、ペン先が主に使用するメインビューの一部ではない、関連付けられていないビューを持つことができるということです。

スクロールビューを表示するビューに、プレースホルダーとして使用する単純なUIViewを配置します。(これは単に、その場所を視覚的に設計できるようにするためです。ビュー全体を使用している場合は、この手順をスキップして、この回答の最後にある2番目のコードスニペットを使用できます)。

次に、スクロールビューにコントロールを入力して、希望どおりに視覚的にレイアウトできます。ビューコントローラ内でプレースホルダーとscrollviewプロパティの両方を指定して、実行時にそれらにアクセスできるようにします。

実行時、-(void)viewDidLoad

scrollView.contentSize = scrollView.frame.size;
scrollView.frame = placeholder.frame;
[placeholder.superview addSubView:scrollView];
[placeholder removeFromSuperview];

または(プレースホルダーを使用しなかった場合):

CGRect f = self.view.frame;
scrollView.contentSize = f.size;
f.origin.x = 0;
f.origin.y = 0;
scrollView.frame = f;
[self.view addSubView:scrollView];

最後に、Interface Builderでスクロールビューを「失う」場合(デザイングリッドから消えるように閉じることができます)、慌てる必要はありません。デザイングリッドの左側にあるオブジェクトリストでクリックするだけです。

于 2012-08-14T11:17:06.830 に答える
4

上記の回答の多くは誤解を招くか、時代遅れです。2017年(おそらくはるか以前)の時点で、InterfaceBuilderは自動的にサイズ設定されたコンテンツを含むスクロールビューをサポートしています。秘訣は、XCodeがスクロールビューとその中のコンテンツの間の制約に特別な非標準の意味を与えることです。これらの「内部」制約は、他の方法で予想されるように、実際にはコンテンツのサイズに影響を与えません

つまり、たとえば、スクロールビューをマージンなしでメインビューの下部に固定したり、スクロールビューのコンテンツをマージンなしでスクロールビューの下部に固定したりできますが、コンテンツは実際にはこれによって拡大されません。代わりに、コンテンツは自己決定されたサイズ(以下で詳しく説明します)を取得し、これはスクロールビュー内のスクロール可能な領域のサイズにもなります。

このように考えてください-スクロールビューへの制約のバインドには非対称性があります。スクロールビューから「外部」(親)ワールドへの制約は、通常どおりスクロールビューのサイズと位置を決定します。ただし、スクロールビューの「内部」の制約は、実際には、スクロールビューのスクロール可能領域のサイズと位置をコンテンツにバインドすることによって設定しています。

制約を設定しようとすると、XCodeは常に現在の間隔を提案し、競合する方法で内向きと外向きの制約を意図的に変更することは決してないため、これはまったく自明ではありません。ただし、上記の意味があります。1つはスクロールビューのレイアウトを制御し、もう1つはスクロール可能なコンテンツ領域のサイズを制御します。

私は偶然これに遭遇し、それがどのように機能するように見えるかを見て、それを完全に説明し、これに関するAppleドキュメントのソースを引用しているこの記事に私を導きました:

https://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/

コンテンツの自己決定サイズに関する最後の重要な情報:通常、コンテンツのサイズを親ビューの幅などに設定しているため、ここではキャッチ22になっていると感じるかもしれませんが、この場合、親はスクロールビューであり、上記のように、制約はコンテンツサイズに影響しません。ここでの答えは、ビュー階層内で直接隣接していないアイテムにアイテムを制限できることを覚えておいてください。たとえば、スクロールビューにそれを実行させるのを無駄にする代わりに、コンテンツビューの幅をメインビューの幅に設定できます。あなたのために。

于 2017-07-24T18:36:22.863 に答える
2

Interface Builderで任意のViewControllerの[プロパティ]アイコンをクリックすると、シミュレートされたメトリックで「フリーフォーム」サイズに設定し、メインビューのサイズを目的のコンテンツサイズに変更できます。

このようにして、ScrollViewのコンテンツを1つの大きなビューであるかのように作成できます。これはシミュレートされたメトリックにすぎないため、ViewControllerはロード時にウィンドウの境界にサイズ変更されます。

于 2013-07-29T16:50:16.870 に答える
2

InterfaceBuilderを介したUIScrollViewの設定は直感的ではありません。これを設定するための私のチェックリストは次のとおりです。

  1. UIViewControllerのXIBファイルを選択します。Interface Builderの「IdentityInspector」で、UIViewをクラスタイプUIScrollViewに変更します

  2. [ファイルインスペクター]で、[自動レイアウト]のチェックを外します

  3. [属性インスペクター]で、サイズを[フリーフォーム]に変更します。次に、スクロールビューを手動で拡大するか、[サイズインスペクター]でカスタムの幅と高さを指定できます。

  4. 「IdentityInspector」で、「Size」タイプの「contentSize」という新しいユーザー定義ランタイム属性を追加し、{320、1000}のような値に変更します。これをプログラムで設定することはできなくなったため、スクロールビューの内容がウィンドウよりも大きいことをスクロールビューが認識できるようにするために、この手順が必要です。

于 2013-08-31T01:23:33.767 に答える
2

スクロールビューのautoLayoutを削除するだけです。その場合、コードは次のように単純です。

scrollviewName.contentSize = CGSizeMake(0, 650);

.hファイルにibouletプロパティを作成してから、.mファイルで合成するだけです。スクロールが有効になっていることを確認してください。

于 2014-07-21T05:56:45.987 に答える
1

はい、st3fanは正しいです。UIScrollViewのcontentSizeプロパティを設定する必要があります。ただし、この目的で自動レイアウトをオフにしないでください。コードなしで、IBのみの自動レイアウトを使用してUIScrollViewのcontentSizeを簡単に設定できます。

自動レイアウトを使用する場合、UIScrollViewのcontentSizeが直接設定されていない場合、UIScrollViewのすべてのサブビューの制約に基づいて計算されることを理解することが重要です。そして、必要なのは、両方向のサブビューに適切な制約を提供することです。

たとえば、サブビューが1つしかない場合は、その高さとスペースを上下からスーパービュー(この場合はscrollView)に設定できます。contentSize.heightは合計として計算されます。

Vertical Space (aSubview.top to Superview.top) + aSubview.height + Vertical Space (aSubview.top to Superview.top)

contentSize.widthは、水平方向の制約から同様に計算されます。

contentSizeを適切に計算するには制約が少なすぎる場合は、レイアウトのあいまいさを通知するために、ViewControllerシーンアイテムの近くに小さな赤いボタンが表示されます。

多くのサブビューがある場合、それは制約の「チェーン」である可能性があります。DanyalAytekinの回答のように、上から上へのサブビュー、サブビュー間の高さとスペース、および下から下へのサブビューです。

ただし、実際には、ほとんどの場合、必要なサイズの空のビューを追加し、scrollViewの上下左右のスペースを0に設定する方が便利です。 このビューを「コンテンツビュー」として使用できます。つまり、他のすべてのサブビューを配置できます。その上に、またはすでに多くのサブビューがあり、それらを移動してレイアウトを再度設定したくない場合は、この補助ビューを既存のサブビューに追加して非表示にすることができます。

scrollViewをスクロール可能にするには、計算されたcontentSizeがscrollViewサイズよりも大きくなければなりません。

于 2015-02-18T14:57:04.177 に答える
1

Autolayoutsを使用してStoryBoardにUIScrollViewを含めることができます。基本的に必要なものは次のとおりです。

  1. UIScrollViewを追加します
  2. すべての制約を追加します(上、左、右、下の端からの挿入図など)
  3. 'コンテナ'UIViewをUIScrollViewに追加します
  4. 一方向のスクロール(たとえば、垂直)だけが必要な場合:高さを明示的に設定し(たとえば、600)、幅をUIScrollViewの幅にリンクします。
  5. 双方向スクロールが必要な場合は、幅と高さの両方を設定するだけです。

ストーリーボードのセットアップ

于 2015-03-31T09:21:15.273 に答える
0

これは、ストーリーボードで画面全体よりも大きいコンテンツを使用してScrollViewを設計するためのソリューションです(ほぼ完全に、1行のコードも追加する必要があります)

https://stackoverflow.com/a/19476991/1869369

于 2013-10-22T10:47:44.160 に答える
0

もっと便利な方法を見つけました。

1:スクロールビューのサイズをスケーリングして、その中にすべてのUIが含まれるようにします。

2:スクロールビューのiboutletを追加します。

3:viewDidLoadで、スクロールビューのframe.sizeを保存します。
(例:_scrollSize = _scrollView.frame.size;)

4:viewWillAppearで、前に保存したCGSizeでcontentSizeを設定します。
(例:_scrollView.contentSize = _scrollSize;)

5:完了〜

于 2014-01-08T08:50:38.080 に答える
0
  1. UIViewControllerを追加します
  2. UIViewControllerの「属性インスペクター」->「シミュレートされたメトリック」でサイズを設定しますフリーフォーム
  3. UIViewController'Size Inspector->ViewController'で高さ800を設定します
  4. UIViewControllerにUIScrollViewを追加します
  5. すべての制約をUIScrollView(上、左、右、下)に追加し、配置を追加しますX=中央
  6. UIScrollViewにUIViewを追加します
  7. すべての制約をUIView(上、左、右、下)に追加し、配置X=中央を追加します。はい、#3のUIScrollViewの場合と同じですが、UIViewの場合です。
  8. UIViewに高さ制約を追加します。例:780
  9. 走る

ストーリーボード

于 2016-11-21T13:48:31.760 に答える
0

新しいXcodeプロジェクトを作成する

Main.storyboardファイルに移動します

オブジェクトライブラリからScrollViewを選択します。

ScrollViewのフレームを設定します。

別のビューをスクロールビューに追加し、フレームをScrollViewのフレームと同じに保ちます。

ここで、高さと幅を動的に設定するには、XIBで自動レイアウトを使用してUIScrollViewを構成します。

于 2018-02-27T11:51:51.767 に答える
0

コードで「contentSize」プロパティを設定しなくても、InterfaceBuilderで完全に実行できます。

  1. スクロールビューにビューを1つだけ配置します。スクロールビューには、この子ビューのみが含まれている必要があります。コンテンツビューという名前を付けることができます。そして、後でこのビュー内にすべてのコンテンツを配置します。
  2. このビューの4つのエッジをスクロールビュー(ビューのスーパービュー)にゼロで揃えます。
  3. このビューの幅と高さを設定します。幅と高さは、スクロールビューの「contentSize」として暗黙的に扱われます。

簡単に言えば、このビューの幅と高さは、スクロールビューの「contentSize」を定義します。このビューはスクロールビューの唯一のコンテンツであるため、このビューのサイズはスクロールビューのコンテンツサイズです。かなりリーズナブルです。

私はこのチュートリアルからそれを学びました: https ://riptutorial.com/ios/example/12812/scrolling-content-with-auto-layout-enabled

于 2022-01-22T15:25:01.297 に答える