web-dev-qa-db-ja.com

UITableViewは、iOS 7でオフセットから始まります

IOS 7では、プレーンジェーンUITableViewをUIViewControllerにドラッグしました。

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

enter image description here

何か案は?

113
user798719

デフォルトでは、Table View Controllerはナビゲーションバーの下にコンテンツを埋め込み、その下のコンテンツをスクロールして、ぼやけた状態でnavbar/toolbarの下に表示できるようにします。

ナビゲーションバーの下から外に移動するために44(たぶん64)pxに配置しているように見えますが、すでにこれを補正しているので、大きなギャップができます。

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

81
Cocoadelica

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

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

View Controller Inspector

詳細については:

  1. 今日iOS 7アプリを提出してください。
  2. iOS 7 UI移行ガイド>外観と動作
106
xudre

iOS7移行ガイドから:

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

   self.automaticallyAdjustsScrollViewInsets = NO;
68
sovanlandy

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

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

これは、次のような親ビューの最初のコントロールでした:

before

ImageViewの直後にtableViewを移動し、動作しました:

after

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

P.D. autoLayoutもストーリーボードも使用していません

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

34
Chuy47

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

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

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

tableView.separatorInset = UIEdgeInsetsZero;

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

13
David Attaie

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

うまくいけば、それが誰かを数分節約します。 Z.

9
Zoltán

IOS 9では、このページの他の回答はどれもうまくいきませんでした(つまり、Storyboardでボックスをオフにし、automaticallyAdjustsScrollViewInsetsNOに設定しました)。

私の回避策は、これが本当に不満でした:

- (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の同じ行は無効でした。

8
Dirty Henry

時々、UIViewControllerがNavigation Controllerに埋め込まれていると、Table Viewの上部に64の高さのギャップができます。

enter image description here

以前は、スレートがきれいになった後に制約が正しくなることを期待して、すべてを再作成していました。

TIL:Top Layout Guideに垂直方向の制約を作成したくない場合は、Optionキーを押してContainer Marginにアクセスできます。

enter image description here

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

enter image description here

5
Robert Chen

これは私のために働く:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

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

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

2
Soft Dev

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. UITableViewの上部に、高さゼロのサブビューを追加します。 Autolayoutの有無にかかわらず動作します。
  2. 自信がある場合:-)この偽のビューを削除し、上部の制約を修正すると、魔法のように機能します。

理由を聞かないでください。UIKitの深いバグだと思います。

1
klauslanza

コンテナービューにUITableViewControllerが埋め込まれていました。不要な64ポイントの垂直スペースを取り除くには、Interface Builderで[スクロールビューのインセットの調整]のチェックを外し、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
user2067021

私はiOS 11とxib、UITableviewControllerで同じ問題を抱えていましたが、以下のように解決しました

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
0
dobiho

Swift 3ソリューション:

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

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

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

ストーリーボードには空のUIViewControllerしかありません。そうでないと、すべてがプログラムで生成されます。

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

この問題を解決するために、UILabelを作成し、制約付きでUILabel bottom constraint = UIViewのtop constraintを配置しました(したがって、画面に表示されません。この追加コントロール(新しいラベル)で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
john

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

0
Nyctitropist

実際の解決策は、tableviewの上部および下部の制約をtopMarginおよびbottomMarginと等しくなるように設定することだと思います。上部レイアウトガイドおよび下部レイアウトガイドではありません。これにより、AdjustsScrollViewInsetsを自動的にtrueに保つことができます。

0
Dan

TableViewControllerをNavigationControllerまたはContainerViewに埋め込んだ場合、You have to constraint to margins instead of top Layout guide in StoryboardCheck constraint to margins when you are doing the constraints私にとって他の方法は機能しませんでした。私はコメントできなかったので、ロバート・チェンスの答えを繰り返し言っています。

0
user3296487