私のアプリでは、UISearchBar
の下にUINavigationBar
があるので、常にユーザーに表示されます。その場合、contentInset
を追加の44pxで設定する必要があったため、UIScrollView
はUISearchBar
(Contacts.appとまったく同じ)の下でスクロールされます。そして、静的なUITableView
には問題はありませんが、私の場合はその内容をリロードする必要があり、UISearchDisplayController
etcに切り替えます。だから私が電話するとき:
[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];
すべてが機能するまでリフレッシュするためにプルします...(このためにSSPullToRefresh
を使用します)。
だから私の質問は次のとおりです。どのようにcontentInset
を永続的に設定できるので、UITableView
内のデータが変更されることを心配する必要はありませんか?
おそらく、私がオートレイアウトやストーリーボードをいじっていたために、何らかのミスがあったのでしょうが、答えが見つかりました。
View ControllerのAttribute Inspectorでこの小さな男の世話をする必要があります
デフォルトのcontentInset
が変更後に設定されないように、チェックを外す必要があります。その後、viewDidLoad
にワンライナーを追加するだけです。
[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; // 108 is only example
iOS 11、Xcode 9アップデート
以前のソリューションは、iOS 11およびXcode 9。 automaticallyAdjustsScrollViewInsets
は非推奨になりました。同様の効果を得るには、Size Inspectorにアクセスする必要があります:
また、コードで同じことを実現できます。
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false
}
Swiftの場合:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0)
}
automaticAdjustsScrollViewInsetsはiOS11で非推奨になりました(受け入れられたソリューションは機能しなくなりました)。つかいます:
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false
}
NumberOfRowsInSectionにコード[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];
を追加します。したがって、テーブルのデータをリロードするたびにcontentInsetを設定します
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];
}
このアプローチでは、空の場合はいつでも検索バーを非表示にすることができます
これは、ストーリーボード(iOS 11およびXcode 9.1)を使用して簡単に修正できる方法です。
[テーブルビュー]> [サイズインスペクター]> [コンテンツインセット:選択しない]を選択します。
TableFooterViewを設定してみてくださいtableView.tableFooterView = UIView(frame:CGRect(x:0、y:0、width:0、height:CGFloat.leastNonzeroMagnitude))