コンテンツが画面に収まるときにUITableViewテーブルのスクロールを無効にする方法


240

私のiphoneアプリにいくつかの(グループ化されたスタイルの)テーブルがあります(画面の一部のみで追加されてInterface Builderいますが、からサブクラス化されていませんUITableViewController)。時間の80%は小さく、画面に収まります。テーブルが画面に収まったら、スクロールを無効にして、少し見やすくします。しかし、テーブルが画面から消えた場合(後で行が追加されたとき)は、再度スクロールを有効にしたいと思います(そうしないと、そのコンテンツが表示されないためです)。

これを行う方法はありますか?理解できないようです。私はすることを知っています:

tableView.scrollEnabled = NO;

しかし、どこで、またはこれを機能させるためにテーブルオブジェクトのサイズなどを計算する必要があるかどうかはわかりません。


更新:これが最終的に私のために働いた解決策です:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

reloadDataテーブルを呼び出した後にこのコードを実行すると、適切なサイズが計算され、機能しているように見えます。

table.frame.size.heightInterface Builder画面に表示されるオブジェクトの実際のサイズ(これはで確認できます)ですが、table.contentSize.heightは高さです:ヘッダー、フッター、および追加されたすべてのセルの高さ。


1
ありがとう。その解決策は私にとってうまくいきました。しかし、UITableViewを拡張し、reloadDataをオーバーライドしてscrollEnabledを無効にしました。その理由は、ビューコントローラーの作成時にテーブルビューが読み込まれるためです。これにより、reloadDataを2回呼び出す必要がなくなります。
Brandon O'Rourke、2012年

@JoeBlow OPのポイントを逃したと思います。問題は、バウンスを無効にする方法ではなく、テーブルビューをスクロールする必要がある場合にのみ、スクロール(およびバウンス)を有効にする方法です。
カイルクレッグ2014

テーブルを少し回転させると、frame.heightが変更されると思うので、おそらく境界を使用する方が良いでしょう。
Ricardo

if(table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

回答:


395

設定したいと思います

tableView.alwaysBounceVertical = NO;

6
AutoLayoutを使用している場合、これはcontentSize <frameよりもうまく機能します。受け入れられるべき答え。
ジョシュアダンス

1
私は自動レイアウトを使用していますが、この答えはまさに私が必要とするものです。
Golden Thumb 2015

3
スクロールを無効にするよりも優れている
Kirit Vaghela、2015

5
チャームのように機能しますinterface builder。バウンスのチェックを外して水平/垂直にバウンスすることで、チャームを無効にすることもできます。
アーサンエブラヒム2015

11
for Swift- tableView.alwaysBounceVertical = false
swiftBoy

44

次の関数を使用して、表示されているセルの数を確認できます。

- (NSArray *)visibleCells

このメソッドは、表示されているセルを含む配列を返すため、この配列内のオブジェクトの数を数え、テーブル内のオブジェクトの数と比較できます。等しい場合は、スクロールを無効にできます。

tableView.scrollEnabled = NO;

@Ginnyが述べたように、部分的に表示されるセルで問題が発生する可能性があるため、この場合はこのソリューションの方が効果的です。

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

autoLayoutを使用している場合は、このソリューションで次のことができます。

tableView.alwaysBounceVertical = NO.

ありがとうございました!これは今のところ私のためにほとんど働いています。私が今持っている唯一の問題は、セルが部分的に表示されている場合でも、それらはまだ表示されていると見なされるため、スクロールを無効にした場合に有効にしたい場合です。
ジニー2011

6
理解した!部分的に表示されているセルの問題のため、visibleCellsを実際に使用することはできませんが、これは機能します。if (table.contentSize.height < table.frame.size.height)>>元の投稿の編集を参照してください。
ジニー2011


14

したがって、複数の回答があり、一度にすべてのコンテンツが必要なので、この回答を追加します。

AutoLayoutを使用している場合は、これを設定するだけで機能します。

  • コードで:

tableView.alwaysBounceVertical = false

  • またはInterface Builderで:

このオプションとuntickBounce Vertically」オプションを見つけてください。

ここに参照があります:

ここに画像の説明を入力してください

AutoLayoutを使用していない場合:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }

13

これを試して

[yourTableView setBounces:NO];

@kyle-メモをありがとう!-しかし、それは自動的に行われることです。画面(または他のホルダー)よりも短い場合、スクロールしません(明らかにバウンスしません。スクロールすらしません)。画面よりも長い場合は、スクロールします(実際にはバウンスします)。番号??
Fattie 2014

たぶん、私はコレクションビューを使いすぎたのかもしれません...コレクションビューで説明したように機能するかもしれませんが、UITableViewでは機能しませんか?
Fattie 2014

9

スクロールビュー領域でバウンスの有効化/無効化またはテーブルビューのスクロールを選択/選択解除して設定できます。

スクロールビュー編集領域


3

ストーリーボードで編集できます(使用している場合)。テーブルビューの下に、「スクロール有効」というチェックボックスがあります。チェックを外すと完了です。


3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;


3
私はあなたの解決策を読んだ後、悟ったと思います。どうもありがとう
Arash

私はこれを自分のviewDidAppearで使用しました
マリア

1
私はviewDidAppearではなくviewDidLayoutSubviewsを意味しました
マリア

0

私が信じているtableviewセルのデフォルトの高さは44.0fです。配列でデータソースを手に持っている必要がありますか?次に[array count]*44.0f、フレームの境界を超えているかどうかを確認し、そうである場合はtableview.scrollEnabled = NO、それをYESに設定します。その特定のテーブルビューのデータソースを把握する場所でそれを行います。


テーブルセルのサイズが異なる(そしていつでもサイズが変わる可能性があります。heightForRowAtIndexPathメソッドを使用しています)ので、おそらく44.0fをハードコードしたくありません。とにかく、その数はtableView.rowHeightと同じだと思いますか?
ジニー2011

次に、その方法で全高を計算します。シンプルでしょ?画面の境界を超える場合はスクロールを有効にし、それ以外の場合は無効のままにします。このメソッドは、表示されているすべてのセルに対して呼び出されます。画面を超えるのに十分なデータがない場合は、その方法で合計の高さを計算できます。グローバル変数に、呼び出しごとに返される高さを追加し続けると、全体の高さがわかります。
Bourne

Robertoの答えは、これらすべてを達成し、計算をテーブルビューに任せるより簡単な方法です。
Bourne
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.