web-dev-qa-db-ja.com

UIScrollView contentInsetプロパティの目的は何ですか?

誰かがUIScrollViewインスタンスのcontentInsetプロパティの用途を説明できますか?そして、例を示しますか?

153
ForeignerBR

コンテンツビューとそれを囲むスクロールビューとの間のインセットの距離を設定します。 aScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 7.0);

良い スクロールビューに関するiOS参照ライブラリの記事 これには有益なスクリーンショットがあります(図1-3)-ここにテキストで複製します。

  _|←_cW_→_|_↓_
   |       | 
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
  _|_______|___ 
             ↑


   (cH = contentSize.height; cW = contentSize.width)

スクロールビューは、コンテンツビューに加えて、指定されたコンテンツインセットによって提供されるパディングを囲みます。

233
jball

Jballの答えはコンテンツの挿入に関する優れた説明ですが、いつ使用するかという質問には答えません。彼の図から借ります:

  _|←_cW_→_|_↓_
   |       | 
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
   |content|    
-------------↑-

それはあなたがそれを行うときに得られるものですが、その有用性はスクロールしたときにのみ示されます:

  _|←_cW_→_|_↓_
   |content| ← content is still visible
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
  _|_______|___ 
             ↑

コンテンツの一番上の行は、スクロールビューのフレーム内にあるため、引き続き表示されます。上部のオフセットを考える1つの方法は、「上部までスクロールしたときにスクロールビューでコンテンツをどれだけシフトするか」です。

これが実際に使用されている場所を確認するには、iPhoneの組み込みの写真アプリをご覧ください。ナビゲーションバーとステータスバーは透明で、スクロールビューの内容は下に表示されます。これは、スクロールビューのフレームがそこまで伸びているためです。ただし、コンテンツの挿入用ではない場合、最上部に移動すると、コンテンツの最上部を透明なナビゲーションバーからクリアすることはできません。

84
Fabian

コンテンツのインセットは、ユーザーインターフェイスの他の部分の下にあるコンテンツを持ちながら、スクロールバーを使用して引き続きアクセスできるという問題を解決します。つまり、コンテンツインセットの目的は、インタラクションエリアを実際のエリアよりも小さくすることです。

画面の3つの論理領域がある場合を考えます。

TOP BUTTONS

TEXT

BOTTOM TAB BAR

また、テキストがトップボタンの下に透過的に表示されないようにする必要がありますが、テキストはボトムタブバーの下に表示され、なおかつスクロールを許可するため、ボトムタブバーの下に透明にあるテキストを更新できます。

次に、上部の原点を上部ボタンの下に設定し、高さを下部タブバーの下部を含むように設定します。 BOTTOM TAB BARコンテンツの下にあるテキストにアクセスするために、BOTTOM TAB BARの高さに下部のインセットを設定します。

インセットがなければ、スクローラーは、入力するのに十分なコンテンツをスクロールアップできません。インセットでは、コンテンツに余分な「空白コンテンツ」が含まれているかのように、コンテンツインセットのサイズが決まります。空白のテキストは、実際の「コンテンツ」に「挿入」されています。これがコンセプトを覚えている方法です。

8
Faisal Memon

UIScrollViewにパディングを追加するために使用されます

contentInsetがない場合、テーブルビューは次のようになります。

enter image description here

次にcontentInsetを設定します。

tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

効果は次のとおりです。

enter image description here

良くなったようですね。

そして、私は ブログ を書いてcontentInsetを研究していますが、批判を歓迎します。

4
fujianjin6471

いい質問ですね。

次の例を考えてください(scrollerはUIScrollViewです):

float offset = 1000;
[super viewDidLoad];
for (int i=0;i<500; i++) {
    UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(i * 100, 50, 95, 100)] autorelease];
    [label setText:[NSString stringWithFormat:@"label %d",i]];
    [self.scroller addSubview:label];
    [self.scroller setContentSize:CGSizeMake(self.view.frame.size.width * 2 + offset, 0)];
    [self.scroller setContentInset:UIEdgeInsetsMake(0, -offset, 0, 0)];
}

インセットは、スクロールしたいコンテンツに「ウィンドウ」を強制的に表示する唯一の方法です。私はまだこのサンプルコードをいじっていますが、アイデアはそこにあります。インセットを使用してUIScrollViewの「ウィンドウ」を取得します。

2
Dan Rosenstark