UITableViewはiOS 7のオフセットで始まります


115

プレーンジェーンUITableViewをiOS 7のUIViewControllerにドラッグしました。

これで、最初のセルが始まる前にスペースの垂直オフセットがあります。どうすれば取り除くことができますか?最初の行を、UITableViewが実際に開始する場所の上端にはるかに近づけたいと思います。私は大きなオフセットを要求しませんでしたか?

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

何か案は?


43
私は以下によって助けられました:YouStoryboard.storyboard> YouViewController>属性インスペクター>オフ-スクロールビューインセットの調整。
アレクサンダー

17
ところで、コマンドキー+ S
Hemang

@Alexander:私もあなたの提案を手伝いましたが、ExtendEdges.UnderTopBarsをオフにすると、垂直オフセットスペースが再び表示されました。Xcode6の(多くの)バグの1つであるかどうかはわかりませんが、これらの問題により、たまに頭痛の種になることがあります。
iOS-Coder 2015

回答:


81

デフォルトでは、テーブルビューコントローラーはコンテンツをナビゲーションバーの下に埋め込み、その下のコンテンツをスクロールして、ぼかした状態で、ナビゲーションバー/ツールバーの下に表示できます。

ナビゲーションバーの下から外に移動するために44(おそらく64)ピクセルに配置しているように見えますが、既にこれを補正しているため、大きなギャップが生じます。

IBのストーリーボード/ xibに移動し、ナビゲーションバーにあるショーコンテンツのチェックを外します。


6
申し訳ありませんが、iOS7のNDAに関するコメントは無関係です。これは人々を助けるためのフォーラムです。
Cocoadelica 2013

Xcodeバージョン5.1のViewcontrollerで拡張エッジのチェックを解除>上部のバーの下で上部のUITableViewコンテンツインセットを削除
Emel Elias

3
では、nav bar thigoの下の番組コンテンツはどこにあるのでしょうか?見つかりません。
Anup Kattel 2014

10
Xcode 5.1.1の@FrankGormanには、特定のView ControllerのストーリーボードにオプションがありますAdjust Scroll View insets。チェックマークを外してください。
コラートプラシャント2014年

1
@koratprashantねえ。非常に役立つコメント。
KDeogharkar 2016

107

UIViewControllerの新しいiOS 7実装には、システムがUIScrollViewUITableView、および派生のインセットを自動的に追加するかどうかを開発者が選択できる新しいオプションセットがあります。

この動作を無効にするには、UIViewControllerで選択したオブジェクトインスペクタで、InterfaceBuilderの必要なすべてのUIViewControllersのこれらのボックスをオフにします。

コントローラーインスペクターの表示

詳細については:

  1. 今すぐiOS 7アプリを送信してください。
  2. iOS 7 UI移行ガイド>外観と動作

ありがとう!あなたは私を救いました。
rsc 2015

68

iOS7移行ガイドから:

スクロールビューのコンテンツインセットを自動的に調整したくない場合は、automaticAdjustsScrollViewInsetsをNOに設定します。(automaticAdjustsScrollViewInsetsのデフォルト値はYESです。)

   self.automaticallyAdjustsScrollViewInsets = NO;

9
これは、属性インスペクターのXCodeでも設定できます。Adjust Scroll View Insetsビューコントローラレイアウトのチェックボックスをオフにします。
Andrew

1
(XIBを使用せずに)プログラムでUIViewControllerをロードすると、これは魅力のように機能します。automaticallyAdjustsScrollViewInsets = NOビューコントローラーで設定します。
KabraBoja 14

これで終わりです。TableViewがコンテナービュー内にあり、最初は問題なく表示されていたため、混乱しています。しかし、別のビューコントローラーからポップバックすると、めちゃくちゃになりました。
n13

すごい!時間を大幅に節約してください!
inix

34

同様の問題があり、viewControllerを閉じた後、tableViewのcontentOffsetが(0、-64)に変更されました。

私の解決策は少し奇妙でした、私は他のすべての答えを試みましたが成功しませんでした、私の問題を解決した唯一のことは.xibのコントロールツリーでtableViewの位置を切り替えることでした

これは親ビューの最初のコントロールでした。

前

ImageViewの直後にtableViewを移動し、それが機能しました。

後

テーブルビューを最初の位置に配置すると問題が発生したようで、テーブルビューを別の位置に移動すると問題が解決しました。

PD私はautoLayoutもストーリーボードも使用していません

これが誰かを助けることを願っています!


同じことに気づいた!追加のビューは配置しませんが、UITableView -44を上に移動するギャップを単純に補正します。IBでは-64pxを移動する必要があるようですが、ランタイムでは-64pxを使用すると、tablviewがナビゲーションバーをオーバーレイし、-44pxで問題ありません。私はそれを完全に説明することはできません。iPhoneのストーリーボードで同様の問題に気付かなかったときに、iPadのポップオーバービューでこの問題を見つけました。
マイク・ケスキノフ2014

この問題は、uiviewを使用しても発生します。ユーザーインターフェイスに表示されるビューが同じ順序で配置されていない場合。
りんくう

2
今日、XCode 6.1で同じ問題が発生しました。Appleのバグを回避しようとして、さらに2〜3時間無駄になってしまいました...
Mike Gledhill

3
これは非常に役に立ち、もっと注目に値します!ビューコントローラーの設定やコンテンツのインセット/オフセットをいじる必要はありませんが、ストーリーボードのビューの順序を変更すると問題が解決しました。
Caleb 2014

1
アップル、つまり... WTF?おかげで、これもautolayoutでストーリーボードを修正しました。
Borzh

30

それは私の同様の問題を解決します:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

1
あなたは、システムのバージョンあちこちにこの方法を使用することを確認する必要があります:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes

これは私が抱えていたスペーシングの問題でうまくいきましたが、今では私のプルトゥリフレッシュコントロールスピナーがトップメニューの下に部分的に隠れて表示されています。誰かこれも見ましたか?回避策はありますか?
ニック

@ nickv2002プログラムでtableViewを作成してみてください
Alex

私は他のすべての解決策を試しましたが、これだけが私のために働きました
DanielR '25年

13

これを使ってみてください

tableView.separatorInset = UIEdgeInsetsZero;

明らかに、iOS7未満をサポートしている場合は、オブジェクトを呼び出す前に、オブジェクトがこのセレクターに応答することを確認する必要があります。


4
なぜこれが投票されているのかわかりません... separatorInsetは、セル間の線がビューの端からはめ込まれる距離を変更するだけです。質問は、セルの上下のスペースについて尋ねています
レンブラントQ.アインシュタイン

画像は誤解を招くものですが、マージンの問題を一般的にグーグルで検索すると、このページが表示されます。
2014年

9

真剣に、変更contentOffsetは解決策ではありません。あなたは問題にパッチを当てているだけで、原因を修正していません。私は同じ問題に直面しており、グループ化された tableViewの上部にパディングがあることがわかりました。私の場合、タイプをプレーンに設定するとうまくいきます。

うまくいけば、数分節約できます。Z


1
私は完全にそれを逃した、あなたの答えを見つけてうれしい、UPVOTE
AamirR

8

iOS 9では、このページの他の回答はどれもうまくいきませんでした(つまり、ストーリーボードのボックスをオフにして、に設定automaticallyAdjustsScrollViewInsetsしますNO)。

私が本当に不満を抱いている私の回避策はこれでした:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

同じviewWillAppearまたはviewDidLoad無効でした。


これがuitableviewcontroller iOS 9の唯一の答えになるはずです。多くの10x
Erez

チェックを外すとAdjust Scroll View insets、チェックボックスは、iOS 9.のために働く
アダム・

スクロールビューのインセットを調整しても他の解決策が機能しない
Yogesh Patel

5

時々 、私が得る64とき私のテーブルビューの上部の高さのギャップをUIViewControllerナビゲーションコントローラの内部に埋め込まれています。

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

以前は、白紙の状態で制約が正しくなることを期待して、すべてを再作成していました。

TIL:に垂直方向の制約を課したくない場合はTop Layout GuideOptionキーを押したままにアクセスできますContainer Margin

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

次に、Top Space to Superview定数がに設定されていることを確認し0ます。これは少なくとも私にとってはうまくいきました。

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


1。5年後、しかしそれは私の夜を解決しました。ありがとう!
asp_net 2017

4

これは私のために働きます:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

2

UITableView(またはScrollViewやTextViewなどのスクロール可能なビュー)の前に空のUIViewを追加すると、運がよくなります。


1

コンテナービューに埋め込まれたUITableViewControllerがありました。不要な垂直スペースの64ポイントを取り除くために、Interface Builderで「Scroll View Insetsを調整」のチェックを外して、UITableViewControllerのviewWillAppearでUITableViewのcontentInsetを以下のように設定する必要がありました。

垂直スペースのサイズは、ナビゲーションバーのフレームの高さとyオフセットに一致するように見えます。この問題はiOS 7でのみ発生しました。

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}

1

Xamarin iOSでは、フォアグラウンドのモーダルダイアログが閉じられた直後に、バックグラウンドのUITableViewControllerでこの問題が発生していました。フォアグラウンドに移動する過程で、UITableViewControllerにはインセットが設定されていました(iOSのどこか)。

このクラスはそれを解決しました

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}

1

時々私はこの恐ろしい状況に戻りますが、それがまだまったく知られていないことに気づきました。だから、将来の記憶のために...

最近、私はこの回避策で修正しています。

  1. 高さ0ピクセルのUITableViewの上部にサブビューを追加します。Autolayoutの有無にかかわらず動作します。
  2. 自信がある場合:-)この偽のビューを削除し、上部の制約を修正すると、魔法のように機能します。

理由は聞かないでください。UIKitのバグの1つだと思います。


0

ストーリーボードに移動する場合は、テーブルを選択してオフセットを変更できます。属性インスペクタの[テーブルビュー]セクションで、左側のセパレータインセットを0に変更するだけです。


0

本当の解決策は、テーブルビューの上部と下部の制約をtopMarginとbottomMarginに等しくなるように設定することだと思います。上部レイアウトガイドと下部レイアウトガイドではありません。これにより、automaticAdjustsScrollViewInsetsをtrueに保つことができます。


0

Swift 3ソリューション:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}

0

あなたはNavigationControllerかContainerViewであなたのTableViewControllerを埋め込まれた場合は、You have to constraint to margins instead of top Layout guide in StoryboardCheck constraint to margins when you are doing the constraints他の方法ではうまくいきませんでした。コメントできなかったので、ロバートチェンスの回答について繰り返し説明します。


0

私はいくつかの答えを試しました。ストーリーボードの設定を変更すると、左からポップアップするオーバーレイメニューでリップルの問題が発生しました。

ストーリーボードには空白のUIViewControllerしかありません。それ以外の場合、すべてがプログラムで生成されます。

UIViewController内のUIView内のUITableViewにも同じ問題があります。つまり、UIViewControllerがNavigation Controllerに埋め込まれている場合、セクションヘッダーの開始位置が極端に低くなります。ナビゲーションコントローラーがなければ、すべてが正常に動作します。

問題を修正するために、UILabelを作成し、UILabel下部制約= UIViewの上部制約を配置して作成しました(そのため、画面に表示されません。追加のコントロール(新しいラベル)を使用すると、TableViewは正しく動作します。

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true

0

iOS 11とxib、UITableviewControllerで同じ問題が発生し、以下のように解決しました

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.