グループ化されたスタイルを使用したテーブルビューのデザインがiOS 7で大幅に変更されたため、最初のセクションヘッダーを非表示(または削除)にしたいと思います。これまでのところ、私はそれを達成することができていません。
やや簡略化された私のコードは次のようになります。
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section == 0)
return 0.0f;
return 32.0f;
}
- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
if (section == 0) {
UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
return view;
}
return nil;
}
- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
if (section == 0) {
return nil;
} else {
// return some string here ...
}
}
高さ0を返す場合、他の2つのメソッドはセクションインデックス0で呼び出されることはありません。それでも、空のセクションヘッダーはデフォルトの高さで描画されます。 (iOS 6では、2つのメソッドが呼び出されます。ただし、表示される結果は同じです。)
別の値を返す場合、セクションヘッダーは指定された高さを取得します。
0.01を返す場合、それはほぼ正しいです。ただし、シミュレータで「Color Misaligned Images」をオンにすると、すべてのテーブルビューセルがマークされます(これは論理的な結果のようです)。
質問への回答 ITableView:空のセクションからヘッダーを隠す は、一部の人々がセクションヘッダーを隠すことに成功したことを示しているようです。ただし、(グループ化されたスタイルではなく)プレーンスタイルに適用される場合があります。
これまでの最善の妥協点は、高さ0.5を返すことです。これにより、ナビゲーションバーの下の線がやや太くなります。ただし、最初のセクションヘッダーを完全に非表示にする方法を知っている人がいれば幸いです。
更新
caglar の分析( https://stackoverflow.com/a/19056823/413337 )によると、テーブルビューがNavigation Controllerに含まれている場合にのみ問題が発生します。
私には合理的にきれいな回避策があります。だから私は自分の質問に答えています。
最初のセクションヘッダーの高さとしての0は機能しないため、1を返します。次に、contentInsetを使用してナビゲーションバーの下にその高さを隠します。
目的C:
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section == 0)
return 1.0f;
return 32.0f;
}
- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
if (section == 0) {
return nil;
} else {
// return some string here ...
}
}
- (void) viewDidLoad
{
[super viewDidLoad];
self.tableView.contentInset = UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0);
}
スイフト:
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return section == 0 ? 1.0 : 32
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.contentInset = UIEdgeInsets(top: -1, left: 0, bottom: 0, right: 0)
}
これは、UITableView(グループ化されたスタイル)の最初のセクションヘッダーを非表示にする方法です。
Swift 3.0およびXcode 8.0ソリューション
TableViewのデリゲートはheightForHeaderInSectionメソッドを実装する必要があります
HeightForHeaderInSectionメソッド内で、最小の正数を返します。 (ゼロではない!)
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
let headerHeight: CGFloat
switch section {
case 0:
// hide the header
headerHeight = CGFloat.leastNonzeroMagnitude
default:
headerHeight = 21
}
return headerHeight
}
答えは私と私のチームにとって非常に面白かったそして魅力的に働いた
理由:
これは、ビュー階層の最初のビューでのみ発生します。この最初のビューがUITableViewの場合。したがって、他のすべての同様のUITableViewには、最初のセクションを除き、この迷惑なセクションはありません。ビュー階層の最初の場所からUITableViewを移動してみましたが、すべてが期待どおりに機能していました。
グループ化されたタイプtableViewにこのトリックを使用
viewDidLoadメソッドでテーブルビューのコードの下に貼り付けます:
tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];
この方法は問題ありません。
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 0 {
return CGFloat.min
}
return 25
}
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 0 {
return nil
}else {
...
}
}
あなたのコードをコピーして試してみました。正常に実行されます(シミュレータで試されました)。結果ビューを添付しました。あなたはそのような眺めが欲しいですよね?または、私はあなたの問題を誤解しましたか?
Swift3:heightForHeaderInSectionは0で動作します。ヘッダーがclipsToBoundsに設定されていることを確認するだけです。
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0
}
clipsToBoundsを設定しない場合、スクロール時に非表示ヘッダーが表示されます。
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
guard let header = view as? UITableViewHeaderFooterView else { return }
header.clipsToBounds = true
}
更新[9/19/17]:iOS 11では、古い答えはもう機能しません。ありがとう。Apple。次のことを行いました:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 20.0f;
self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);
前の回答:
Chris Ostomo によるコメントで投稿されたように、以下が私のために働いた:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return CGFLOAT_MIN; // to get rid of empty section header
}
Swiftで、グループ化されたUITableViewの上部セクションヘッダーを削除する方法は次のとおりです。
tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
Swift 4.2およびそれ以前の多くのバージョンでは、他の回答のように最初のヘッダーの高さを0に設定する代わりに、他のヘッダーをnil
に設定することができます。 2つのセクションがあり、2番目のセクション(つまり、1
)にのみヘッダーが必要だとします。そのヘッダーには、テキストFoobarが含まれます。
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return section == 1 ? "Foobar" : nil
}
一番簡単なのは、ヘッダーを表示したくないセクションのnil
またはfunc tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
の""
を返すことです。
まだコメントできませんが、UISearchController
がUISearchBar
であるコントローラー上にtableHeaderView
がある場合、heightForHeaderInSection
の最初のセクションの高さを0に設定すると、実際に機能すると思います。
self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);
を使用して、デフォルトで検索バーを非表示にします。
結果として、最初のセクションにはヘッダーがなく、下にスクロールすると検索バーが最初の行のすぐ上に表示されます。
すべてのセクションヘッダーを完全に削除する場合は、これを試してください
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}