UITableViewのセルの前の空スペースを削除


172

現在UITableView、ビューコントローラーの上部ではなく、別の場所にを配置しようとしています。これで、ナビゲーションバーを説明するために上部にヘッダーを追加しようとしていますが、コントローラーの上部にないため、これは必要ありません。

UITableViewセルを配置する場所の左上隅を配置しても、セルはそこに配置されません。

ここで、セルが正しい場所にあるようにテーブルビューを上に移動すると、別の問題が発生します-スクロールすると、セルがそこまで上に移動します(これは、ナビゲーションコントローラーの上にある指で行います)。

手放すと、はい-セルは検索バーのすぐ下に移動しますが、これを明らかに上に移動する方法には問題があります。

これを行うにはどうすればよいですか?もっと簡単な方法はありますか?

回答:


378

UITableView下にスクロールすると、番組のセルは何もないスペースに表示されますか?

その場合、問題はUITableView、ビューに表示されているナビゲーションコントローラーが原因で追加された差し込みである可能性があります。スクロールが発生していないときにコンテンツがナビゲーションバーの下に配置されるように、挿入図がテーブルビューに追加されます。テーブルがスクロールされると、コンテンツがスクロールし、透明なナビゲーションバーの下に表示されます。もちろん、この動作は、テーブルビューがナビゲーションバーのすぐ下で始まる場合にのみ必要ですが、ここではそうではありません。

注意すべきもう1つの点は、iOSがコンテンツインセットを調整するのは、ビュー階層の最初のビューであるか、それがUIScrollView子孫である場合のみです(例:UITableViewおよびUICollectionView)。ビュー階層に複数のスクロールビューが含まれている場合、automaticallyAdjustsScrollViewInsetsでは最初のスクロールビューのみが調整されます。

この動作を変更する方法は次のとおりです。

a)インターフェイスビルダー

  • View Controllerを選択します
  • 属性インスペクターを開く
  • IBの属性インスペクター(ビューコントローラーが選択されている場合)には、「スクロールビューインセットの調整」と呼ばれるプロパティがあり、デフォルトでオンになっています。このオプションをオフにします。


    (画像提供:Dheeraj D

このオプションが導入されたXcodeのバージョンはわかりません(リリースノートに記載されていませんでした)が、少なくともバージョン5.1.1では利用可能です。

編集:混乱を避けるために、これはコメントで言及された3番目のオプションでした

b)プログラムで

これをieに追加しますviewDidLoadSlavco Petkovskiの回答およびCris Rのコメントへのクレジット)

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c)これは古い学校の生徒に関係があるかもしれません

これを修正するには、

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

または、IBを使用していて、ナビゲーションバーが透明でない場合(スクリーンショットからはわかりません)

  • View Controllerを選択します
  • 属性インスペクターを開く
  • ビューコントローラーオプションの[エッジの延長]セクションで、[トップバーの下]の選択を解除します。

2
UIViewで[Under Top Bars]の選択を解除すると、問題なく動作しました。ありがとう。
AndreasØverland2014年

「ページングが有効」を使用していて、セル全体ではなく、ナビゲーションバーの高さだけスクロールがシフトすることに怒っていました。ありがとう。
LordParsley 2014

8
3番目のオプション:[スクロールビューのインセットを調整]の選択を解除します-魅力のように機能しました。よろしくお願いします!
Stas Zhukovskiy、

2
self.automaticallyAdjustsScrollViewInsets = falseは、「de pelos」で動作するSwiftの場合です!
クリスR

1
おかげで、表示されるたびに新しいテーブルコントローラーでテーブルを再利用する場合は、UIEdgeInsetsZeroの設定が必要です。
Malhal

71

私はこれと同じ問題を抱えていて、ある時点でUIViewがそこにあったと確信しています。テーブルビュー全体をコピーして削除し、再度貼り付けるだけで修正されました。


7
これは本当に奇妙です。これで問題は解決しました。これが起こったときの考えは?
MiQUEL 2013年

2013
1

同じ問題がありました。それを削除して再読み込みすることも私にとってうまくいきました。
sma 2014年

3
私が知る限り、スクロールビューのコンテンツインセットは、スクロールビューがビューコントローラービュー階層の最初の子である場合にのみ、自動的に調整されます(automaticAdjustsScrollViewInsets = YESの場合、デフォルトです)。テーブルビューをコピーして貼り付けた後は、ビュー階層の最初のビューではなくなるため、このソリューションは機能すると思います。
lekksi 2014

何が起こるかというと、tableViewが最初にビューに追加された場合、システムはナビゲーションのための余地を残さなければならないと考えます。ここで私の推測では、tableViewを追加してからheaderViewを追加する人もいます。いくつかの問題が発生した後、tableViewを削除してから再度追加すると、headerViewが階層の最初にあるため、システムを適応させる必要がなくなり、問題は解決しました。私はコードのみを使用しているのでわかっているので、私の場合、最初にヘッダーを追加してから、テーブルを追加して修正する必要がありました。
Lluis Gerard

40

ストーリーボードでテーブルビューを選択し、スタイルが「グループ化」ではなく「プレーン」に設定されていることを確認します。この設定は、属性インスペクタタブにあります。


すごい..これは奇妙なことに私にとって解決策でした..私はビューコントローラー全体をコピーして貼り付けただけですが、どういうわけかこの貼り付けられたビューコントローラーのtableViewには奇妙なオフセットがありました。この回答は私の問題を解決しました
daisura99 '27 / 07/18

これで問題は解決しましたが、ヘッダーセクションの動作が異なります。誰でも?
Bruno Muniz

お大事に。この世界のどこにいても。あなたを永遠に祝福してください。
gabuchan

9

私の場合、ビュー階層のUITableViewの下にUILabelがありました。

「前に」動かすと空白が出ました。理由はわかりませんが、このように機能します。tableViewの下に何かがあると、空白スペースが非表示になります。

また、ストーリーボードのビューコントローラーインスペクターで[スクロールビューインセットの調整]をオン/オフにすることもできます。

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


2
私はグループ化されたUITableViewを持ち、「スクロールビューインセットの調整」のチェックを外すと動作しました。
マット

5

上記のどれも私を助けませんでした。しかし、これを行うと役に立ちました

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

'-64'の代わりに、ナビゲーションバーの高さに応じて他の任意の数値を入力できます。


4

あらかじめ追加されている場合がありUIRefreshControlます。私はこのようなコードでこの問題を抱えています:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

ご覧のとおり、私はself.refreshController直後に設定しましたinit

ただし、refreshControlセットアップ後に設定した場合は、トップスペースが邪魔になることはありません。

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

これが本当の問題だったなんて信じられない。9.3.5以下の場合、これは私だけの問題です。これを世界でどのように理解しましたか?
サイレン

4

iOS 11でこれを実行している場合、非推奨であるため自動的に調整され、次のコードがこの投稿の回答に従って機能しました:https : //stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

お役に立てれば。



3

はっきりとは言えませんが、プロトタイプセルの開始位置とUITableViewの最上部の間に余分なUIViewが詰まっているようです。追加したテキスト/行を削除すると、私の画像はあなたの画像とまったく同じになります。

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


3

上部に余分なスペースが生じた原因はまだわかりませんが、UITableViewをスペースで削除して新しいものに置き換えると、スペースが失われることがわかりました。

誤ってUIViewをそこにドラッグしたはずですが、選択できなかったため削除できませんでした。


3

スウィフト5

tableHeaderViewtableFooterViewを削除してみてください

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

ストーリーボードまたはxibでテーブルビューフレームを確認します。私の鉱山にはデフォルトでyの位置値があるため、バグ


2

私のアプリケーションでも、このような問題が発生しました。tableViewの上端インセットをゼロに設定しました。も設定falseしてみましたautomaticallyAdjustsScrollViewInsets。しかし、うまくいきませんでした。

最後に私は実用的な解決策を得ました。これが正しい方法かどうかはわかりません。しかし、heightForHeaderInSectionデリゲートメソッドの実装は私にとってはうまくいきました。これを機能させるには、ゼロ以外の値を返す必要があります(ゼロを返すと、以前と同じスペースが表示されます)。

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

2017年に私のために働いているのは、この1行だけです

navigationController?.navigationBar.isTranslucent = false

それがなぜそれに影響を与えるのか私にはわかりません。おそらく誰かが説明できるでしょう。しかし、これはほとんどの人が求める答えだと確信しています。


それも私にとってはうまくいきました。ありがとう!
scurioni 2017年

2

iOS 11以降では、アップルはコンテンツインセットを調整するためにプロパティを変更しました。使用contentInsetAdjustmentBehaviorおよび設定.never上の余分なスペースを削除するためにUICollectionViewUIScrollViewUITableView

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

これがお役に立てば幸いです。


1

私にとっては、プロトタイプセルをメニューからテーブルビューにドラッグしたときに問題が発生しました。だから私はそれを削除し、テーブルビューインスペクターのプロパティでプロトタイプセルを1に設定しました


1

私はこれをプログラムで行っており、他のすべてのサブビューを追加した後、addSubview(tableView)を一番下に移動するだけで、問題が解決しました!

なぜこれがデバイスにのみ表示され、シミュレータには表示されないのかはわかりませんが、いずれにしても簡単な解決策があります!


1

UITableViewがビューコントローラーの最初のサブビューでない限り、空のスペースは表示されません。

解決策:非表示/クリアのビューオブジェクト(ビュー、ラベル、ボタンなど)をビューコントローラーの最初のサブビューとして追加します(UITableViewと同じレベルですが、その前にあります)。


これを理解するために多くの時間を費やし、ここや他の投稿で多くの提案を試みました。これはそれを解決したものです。ありがとうございました!その理由を説明したり、そうしたドキュメントへのリンクを投稿したりできますか?私はiOS開発を学んでいるだけで、Androidとはとても異なります!:)
マーク

0

UIViewはテーブルの上部と下部に挿入できます(ドラッグアンドドロップ)。プロパティを透明で高さ1ピクセルに設定します。これは、セルの前にある余分なパディングを削除するためです。


0

また、この問題がありました。tableViewが階層の最後のビューではありませんでした。私の場合、(互いにオーバーラップしていなくても)上のビューがあったので、それを階層内のtableViewの上にドラッグし、それで作成しました。


0

私はこれに対する解決策を見つけました。

tableviewとclic Editor-> Arrange-> Send to Frontを選択するだけです

それは私のために働いた、そしてそれがあなたたちすべてを助けることを望んでいる


0

私の場合、私はContainerViewControllerを使用していて、それにUITableViewControllerを入れていました。ContainerViewControllerを削除した後。問題はなくなります。


0

Xcode 8のバグ…

Storyboard UITableViewスタイルがPlainに設定されている場合は、最初にこれを試してください。

テーブルのスタイルを[グループ化]に設定してから、[プレーン]に戻します。これにより、UITableViewの先頭にあるアプリのスペースが削除されました。


0

私の場合、コンテナービューを使用していました(メインビュー->コンテナービュー-> UITableView)。

上部の余分なスペースは、デバイスの通知バー(時間を表示する場所、バッテリー)のスペースと同じだと思います。私は本当にそうです、それは仮定ではありません。

私がしたことはUIビルダーからのものでした:

  • テーブルビューコントローラーを選択します。
  • 属性インスペクターを開く
  • -> View Controller-> Layout->「Select Wants Full Screen」に移動します

0

このコードを使用して、テーブルが作成されるviewDidLoadまたはviewDidAppearにアクセスできます。

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

underTopBarプロパティがチェックされないようにストーリーボードでViewControllerの拡張エッジを設定します。


0

同じ問題がありました。以下をviewDidLoadに追加することで解決しました。

self.extendedLayoutIncludesOpaqueBars = true


-2

チェックする

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • tableviewデリゲート関数cellForRowAtIndexPathについて言及
  • iOS 6と7の両方を処理できます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.