web-dev-qa-db-ja.com

UITableViewコンテンツインセットを永続的に設定します

私のアプリでは、UISearchBarの下にUINavigationBarがあるので、常にユーザーに表示されます。その場合、contentInsetを追加の44pxで設定する必要があったため、UIScrollViewUISearchBar(Contacts.appとまったく同じ)の下でスクロールされます。そして、静的なUITableViewには問題はありませんが、私の場合はその内容をリロードする必要があり、UISearchDisplayControlleretcに切り替えます。だから私が電話するとき:

[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];

すべてが機能するまでリフレッシュするためにプルします...(このためにSSPullToRefreshを使用します)。

だから私の質問は次のとおりです。どのようにcontentInsetを永続的に設定できるので、UITableView内のデータが変更されることを心配する必要はありませんか?

61
cojoj

おそらく、私がオートレイアウトやストーリーボードをいじっていたために、何らかのミスがあったのでしょうが、答えが見つかりました。

View ControllerのAttribute Inspectorでこの小さな男の世話をする必要があります asvi

デフォルトのcontentInsetが変更後に設定されないように、チェックを外す必要があります。その後、viewDidLoadにワンライナーを追加するだけです。

[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; // 108 is only example

iOS 11、Xcode 9アップデート

以前のソリューションは、iOS 11およびXcode 9automaticallyAdjustsScrollViewInsetsは非推奨になりました。同様の効果を得るには、Size Inspectorにアクセスする必要があります: enter image description here
また、コードで同じことを実現できます。

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

Swiftの場合:

override func viewDidLayoutSubviews() {
      super.viewDidLayoutSubviews()
      self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0)
}
62
rmooney

automaticAdjustsScrollViewInsetsはiOS11で非推奨になりました(受け入れられたソリューションは機能しなくなりました)。つかいます:

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
} else {
    automaticallyAdjustsScrollViewInsets = false
}
7
Matan Guttman

NumberOfRowsInSectionにコード[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];を追加します。したがって、テーブルのデータをリロードするたびにcontentInsetを設定します

4
Fran Martin

1時間のテストの後、100%動作する唯一の方法は次のとおりです。

-(void)hideSearchBar
{
    if([self.tableSearchBar.text length]<=0 && !self.tableSearchBar.isFirstResponder)
    {
        self.tableView.contentOffset = CGPointMake(0, self.tableSearchBar.bounds.size.height);
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

-(void)viewDidLayoutSubviews
{
    [self hideSearchBar];
}

このアプローチでは、空の場合はいつでも検索バーを非表示にすることができます

2
Kappe

これは、ストーリーボード(iOS 11およびXcode 9.1)を使用して簡単に修正できる方法です。

[テーブルビュー]> [サイズインスペクター]> [コンテンツインセット:選択しない]を選択します。

2
Pink Panther

TableFooterViewを設定してみてくださいtableView.tableFooterView = UIView(frame:CGRect(x:0、y:0、width:0、height:CGFloat.leastNonzeroMagnitude))

0
user3168555