UITableViewStylePlainを使用してUITableViewのフローティングヘッダーを無効にすることは可能ですか?


177

私はUITableViewコンテンツ「ページ」のレイアウトに使用しています。テーブルビューのヘッダーを使用して特定の画像などをレイアウトしていますが、スタイルがに設定されている場合と同じように、フロートせずに静的のままである場合は、それを使用しUITableViewStyleGroupedます。

他にを使用する場合UITableViewStyleGrouped、これを行う方法はありますか?すべてのセルの下にマージンが追加され、各セルの背景ビューを無効にする必要があるため、グループ化の使用を避けたいです。レイアウトを完全に制御したいのですが。理想的には「UITableViewStyleBareBones」になるでしょうが、ドキュメントにそのオプションは表示されませんでした...

どうもありがとう、



59
テーブルスタイルUITableViewStyleGroupedを使用する-これは、フローティングヘッダーを無効にし、質問全体を読まないすべての人への答えです(たまたま...)。
平均ジョー

@Kasztanこれは非常に効果的なゼロラインソリューションです!ありがとう。
Lee Fastenau、2015年

回答:


27

カスタムセルを使用してヘッダー行を作成することで、これを偽造できるはずです。これらは、テーブルビューの他のセルと同様にスクロールします。

cellForRowAtIndexPathヘッダー行であるときに正しいセルタイプを返すには、ロジックを追加する必要があります。

ただし、セクションを自分で管理する必要があります。つまり、すべてを1つのセクションに入れて、ヘッダーを偽造する必要があります。(ヘッダービューの非表示ビューを返すこともできますが、それが機能するかどうかはわかりません)


11
うん...それは少しハックのようですが。これはAppleの一部の見落としのようです。コードがそれを行うためにあるので、フラグを設定できる必要があるだけです。
トリッキー

2
特別なハックなしで効果を達成する正しい方法については、以下の私の回答を確認してください。すべてのセクションの最初のセルをセクションヘッダーとして管理してください。
Sumit Anantwar 2013

338

これを達成するためのおそらくより簡単な方法:

Objective-C:

CGFloat dummyViewHeight = 40;
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, dummyViewHeight)];
self.tableView.tableHeaderView = dummyView;
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0);

迅速:

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

セクションヘッダーは、通常のセルと同じようにスクロールします。


5
このフリギンは魅力のように機能します!! テーブルヘッダービューヘッダーが存在すると、セクションヘッダーのフローティングが停止します。そして、テーブルに適切なコンテンツインセットを備えた非表示のヘッダーは、トリックを実行します。なぜこの答えがあまり注目されていないのか不思議に思う
Shyam Bhat

4
まだ信じてはいけません!プライベートAPIも、クラスの詳細も、何もありません。私は古くからこの問題に直面しており、テーブルビューをスクロールビューの上に(テーブルビュースクロールを無効にして)追加しているため、テーブルヘッダーが正常にスクロールします。しかし、アップルが最近これを修正するための新しい方法を提供しているかどうかを検索し始めたばかりです。再度ありがとう
Shyam Bhat

13
私が見た唯一の欠点は、上部ヘッダーが表示されなくなることです(上にスクロールすることによってのみ表示されます)。少なくとも私にとっては表示されません
Ruzard

5
上部の高さをセクションヘッダーの高さに等しい数だけ増やすことで、テーブルのtableHeaderViewを引き続き表示し、同じ数だけコンテンツインセットを減らすことができます。
Shyam Bhat

2
私はこれをもう一度賛成できればいいのですが、これが少なくともこの質問に答えたのは3回目であり、これで私の問題は解決しました。
Ell Neal

252

(間違ったテーブルスタイルのためにここに来た人のために)属性インスペクタまたはコードを使用して、テーブルスタイルをプレーンからグループ化に変更します。

let tableView = UITableView(frame: .zero, style: .grouped)

3
これはまさに私が探していたものです。ありがとう!
ninjudd 14

4
「他にUITableViewStyleGroupedを使用していますが、これを行う方法はありますか?」
マイケルピーターソン

27
最も賛成の回答を実装する前に、すべての回答を確認することを学んだ良いことです:)
Tung Fam

1
さて、これがあなたが探していた答えです。TableView Styleプロパティは、AttributesInspectorでも見つけることができることに注意してください。
クリスティアンホルドゥヌ2018

4
質問は、「UITableViewStyleGroupedを使用してその他の方法」を探すことについて具体的に言及しています
Ferdz

73

警告:このソリューションは予約済みのAPIメソッドを実装しています。これにより、アプリがAppStoreでの配布についてAppleによって承認されるのを防ぐことができます。

セクションヘッダーをフローティングするプライベートメソッドについて説明しました ブログにいる

基本的には、サブクラスUITableViewを作成NOし、そのメソッドの2つで返す必要があります。

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;

40
回答は、プライベートAPIを参照しているという理由だけで賛成票に値しません(AppStoreに送信されるコードを誰もが書いているわけではありません)。答えがたまたま正しい場合、これは二重に当てはまります。これらのメソッドに対してNOを返すサブクラス化(より簡単には、UITableViewカテゴリを作成)は、ヘッダーのフローティングを停止します。これをパブリックAPIとして追加したい場合は、バグレポートを提出してください:bugreport.apple.com
jemmons

5
アプリにその関数を実装する場合、AppleはプライベートAPIを使用していることにどのように気づくでしょうか?彼らが知っているすべてのことから、UITableViewのサブクラスにメソッドを実装しただけで、コードを逆アセンブルしないとそれを確認することもできず、それほど簡単ではありません。それはプライベートAPIでメソッドを呼び出していない、それだけで.... 1を実装しています
ハビエル・ソト

3
@jemmons私があなたの回答に反対票を投じたくない場合は、「ここではプライベートAPIが使用されます」とマークします。免責事項の並べ替え:)
kas-kad 2013年

2
"私のブログ"リンクが壊れている
MartinMoizard 2014年

12
@jemmons「誰もがAppStoreに送信するコードを書いているわけではありません」Appstoreは本当に問題ではありません。問題は、Appleが通信したり非推奨にしたりせずにプライベートAPIを変更できることです。これが、Appleに拒否されるよりもプライベートAPIを使用してはならない理由です
aryaxt

29

わかりました、遅いのはわかっていますが、やらなければなりませんでした。実用的なソリューションを探すまでに10時間を費やしましたが、完全な答えは見つかりませんでした。いくつかのヒントが見つかりましたが、初心者には理解が困難でした。だから私は私の2セントを入れて答えを完成させなければなりませんでした。

いくつかの回答で示唆されているように、実装できた唯一の実用的な解決策は、テーブルビューに通常のセルを挿入してセクションヘッダーとして処理することですが、これを実現するより良い方法は、これらのセルをすべてのセクションの行0。この方法で、これらのカスタム非フローティングヘッダーを非常に簡単に処理できます。

したがって、ステップは次のとおりです。

  1. UITableViewStylePlainスタイルでUITableViewを実装します。

    -(void) loadView
    {
        [super loadView];
    
        UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
        tblView.delegate=self;
        tblView.dataSource=self;
        tblView.tag=2;
        tblView.backgroundColor=[UIColor clearColor];
        tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
  2. 通常どおりtitleForHeaderInSectionを実装します(独自のロジックを使用してこの値を取得できますが、標準のデリゲートを使用することをお勧めします)。

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. 通常のnumberOfSectionsInTableViewの実装

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. 通常どおりnumberOfRowsInSectionを実装します。

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    {
        int rowCount = [[cellArray objectAtIndex:section] count];
        return rowCount +1; //+1 for the extra row which we will fake for the Section Header
    }
  5. heightForHeaderInSectionに0.0fを返します。

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. viewForHeaderInSectionを実装しないでください。nilを返す代わりに、メソッドを完全に削除します。

  7. heightForRowAtIndexPath内。if(indexpath.row == 0)を確認し、セクションヘッダーの目的のセルの高さを返します。それ以外の場合は、セルの高さを返します。

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0)
        {
            return 80; //Height for the section header
        }
        else
        {
            return 70; //Height for the normal cell
        }
    }
  8. 次にcellForRowAtIndexPathでif(indexpath.row == 0)を確認し、セクションヘッダーを希望どおりにセルを実装して、選択スタイルをnoneに設定します。ELSEは、通常のセルにしたいとおりにセルを実装します。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
    
                cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
            }
    
            cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
    
            return cell;
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
    
                cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
                cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
            }
    
            cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
    
            return cell;
        }
    }
  9. 次に、willSelectRowAtIndexPathを実装し、indexpath.row == 0の場合はnilを返します。これにより、セクションヘッダー行に対してdidSelectRowAtIndexPathが呼び出されないようになります。

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. 最後に、didSelectRowAtIndexPathでif(indexpath.row!= 0)を確認して続行します。

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row != 0)
        {
            int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
    
            //Do what ever you want the selection to perform
        }
    }

これで完了です。これで、完全にスクロールする非フローティングセクションヘッダーができました。


1
セクションヘッダー行の選択時にコントロールが 'didSelectRowAtIndexPath'に到達しないように、 'willSelectRowAtIndexPath'を実装しました。
Sumit Anantwar 2013年

実際には、ヘッダーが選択されているときに行を折りたたみ+展開します。しかし、あなたがそれを行うことができることを知っておくとよい
Yariv Nissim 2013年

すばらしい答えですが、なぜ 'if(indexPath.row!= 0)'が 'didSelectRowAtIndexPath'をチェックインするのですか?安全性を高めるだけですか?'willSelectRowAtIndexPath'実装では、行を0にすることはできませんよね?
Glenn85 2013

1
@ Glenn85、返信が遅くなってすみません。はい、それは追加のセキュリティのためだけです。
Sumit Anantwar 2013年

28

インターフェイスビルダーで、問題のテーブルビューをクリックします。

問題のテーブルビュー

次に、属性インスペクターに移動し、スタイルプレーンをグループ化に変更します。

簡単


17

UITableViewStyleGroupedの興味深い点は、tableViewがスタイルをTableViewではなくセルに追加することです。

スタイルは、セクション内のセルの位置に応じて異なる背景の描画を処理するUIGroupTableViewCellBackgroundと呼ばれるクラスとして、セルにbackgroundViewとして追加されます。

したがって、非常に簡単な解決策は、UITableViewStyleGroupedを使用し、テーブルのbackgroundColorをclearColorに設定して、cellForRowのセルのbackgroundViewを置き換えるだけです。

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

1
これが一番の答えになるはずです。それについてのブログ記事はここにあります:corecocoa.wordpress.com/2011/09/17/...
サム・

このソリューションは実際には機能しません。細胞の周りに余分なスペースができてしまいます。何か案が ?
gsempe

2
セルのcontentViewはまだ右にシフトしませんか?
Piotr Tomasik 2012年

15

TableViewスタイルを変更します。

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

UITableViewのアップルのドキュメントに従って:

UITableViewStylePlain-プレーンテーブルビュー。セクションヘッダーまたはフッターはインラインセパレータとして表示され、テーブルビューがスクロールされるとフロートします。

UITableViewStyleGrouped-セクションが異なる行のグループを表示するテーブルビュー。セクションのヘッダーとフッターはフロートしません。


5

別のトリッキーな方法があります。主なアイデアは、セクション番号を2倍にすることです。最初の1つはheaderViewのみを表示し、2つ目は実際のセルを表示します。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

次に、headerInSectionデリゲートを実装する必要があります。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

このアプローチは、データソースへの影響もほとんどありません。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

他のアプローチと比較すると、この方法は、テーブルビューのフレームやcontentInsetsを変更しない限り安全です。これが役立つことを願っています。


5

必要なものを取得する最も簡単な方法は、テーブルスタイルをUITableViewStyleGrouped、セパレータースタイルをとして設定することですUITableViewCellSeparatorStyleNone

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

nil必要なものを取得する必要がある場合は、フッタービューをとして返さないでください。ヘッダーの高さとヘッダービューを設定することを忘れないでください。


4

これはあなたの問題を解決しないかもしれませんが、私が同様のことをしたかったときに私はそれをしました。ヘッダーを設定する代わりに、上のセクションのフッターを使用しました。私を救ったのは、このセクションが本質的に小さく静的であったため、ビューの下部の下にスクロールされなかったことです。


いい案。私はこのハックが大好きです。
Steve Moser

ちょっとおかしい。アイデアを高く評価しますが、ハックはハックです。ヘッダーが下から浮き始めるため、問題は実際には解決しません
Shyam Bhat

4

Swift 3以降の場合

次のように使用UITableViewStyleGroupedして、フッターの高さをゼロに設定します。

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
の代わりに0を返すことができ.leastNormalMagnitudeます。また、実装する必要がありますtableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
Ilias Karim

@IliasKarimこれを0に設定すると、高さがゼロ以外になることがあります。また、viewForFooterInSectionこの場合、関数を実装する必要はありません。
タマシュSengel

0そして、.leastNormalMagnitude同じ効果を持っていました。viewForFooterSectionメソッドの実装が必要です。nilを返す必要があります。これは、Xcode 11.3.1を搭載したSwift 5.1上にあります。
Ilias Karim

3

この問題への取り組み方を考えているときに、UITableViewStyleGroupedに関する非常に重要な詳細を思い出しました。UITableViewがグループ化されたスタイル(セルの周りの丸い境界線)を実装する方法は、UITableViewではなくUITableViewCellsにカスタムbackgroundViewを追加することです。各セルには、セクション内の位置に応じてbackgroundViewが追加されます(上部の行はセクションの境界線の上部、中央の行は側面の境界線、下部の行は側面の境界線、下部の行は下部に表示されます)。したがって、プレーンスタイルだけが必要で、セルのカスタムbackgroundViewがない場合(90%の場合)、UITableViewStyleGroupedを使用して、カスタム背景を削除するだけです。 。これは、次の2つの手順に従って実行できます。

tableViewスタイルをUITableViewStyleGroupedに変更します。セルを返す直前に、次の行をcellForRowに追加します。

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

以上です。tableViewスタイルは、フローティングヘッダーを除いて、UITableViewStylePlainとまったく同じになります。

お役に立てれば!


2

たぶんscrollViewDidScroll、tableViewで使用してcontentInset、現在表示されているヘッダーに基づいてを変更できます。

私のユースケースではうまくいくようです!

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}

1

これを行う別の方法は、ヘッダーを配置するセクションの直前に空のセクションを作成し、そのセクションにヘッダーを配置することです。セクションが空なので、ヘッダーはすぐにスクロールします。


1

上記の1つのセクション(0行)を追加してから、上記のsectionFooterViewを現在のセクションのheaderViewとして設定できます。footerViewは浮動しません。お役に立てば幸いです。


FooterViewsは、HeaderViewsと同様にフロートします。上部ではなく、画面の下部に浮かぶだけです。
Mark A. Donohoe

0

XAKを無視します。アプリがアップルに受け入れられる可能性がある場合は、プライベートメソッドを探索しないでください。

これは、Interface Builderを使用している場合に最も簡単です。ビューの上部(画像が配置される場所)にUIViewを追加し、その下にテーブルビューを追加します。IBはそれに応じてサイズを調整する必要があります。つまり、テーブルビューの上部が追加したUIViewの下部に接触し、その高さが画面の残りの部分を覆っています。

ここでの考え方は、そのUIViewが実際にテーブルビューの一部でない場合、テーブルビューでスクロールしないということです。つまり、tableviewヘッダーを無視します。

インターフェイスビルダーを使用していない場合は、テーブルビューの位置と高さを正しく設定する必要があるため、少し複雑になります。


これは質問の答えにはなりません。Trickyは、セルの間に位置するビューであるtitleHeaderViewsを参照しています。提案しているように見えるテーブルヘッダービューではありません。
Daniel Wood


0

フローティングセクションヘッダーセクションを完全に削除するには、次のようにします。

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil 動作しません。

フローティングを無効にしてセクションヘッダーを表示するには、独自の動作を持つカスタムビューを提供できます。


0

@samvermetteのソリューションのバリエーション:

/// Allows for disabling scrolling headers in plain-styled tableviews
extension UITableView {

    static let shouldScrollSectionHeadersDummyViewHeight = CGFloat(40)

    var shouldScrollSectionHeaders: Bool {
        set {
            if newValue {
                tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: bounds.size.width, height: UITableView.shouldScrollSectionHeadersDummyViewHeight))
                contentInset = UIEdgeInsets(top: -UITableView.shouldScrollSectionHeadersDummyViewHeight, left: 0, bottom: 0, right: 0)
            } else {
                tableHeaderView = nil
                contentInset = .zero
            }
        }

        get {
            return tableHeaderView != nil && contentInset.top == UITableView.shouldScrollSectionHeadersDummyViewHeight
        }
    }

}

0

スニペットでは、最初のセクションにのみスティッキーヘッダーが表示されます。その他のセクションヘッダーは、セルと共にフロートします。

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}

-1

これは、デリゲートのviewForHeaderInSectionとheightForHeaderInSectionを使用する代わりに、UITableViewControllerのviewDidLoadメソッドでヘッダービューを手動で割り当てることで実現できます。たとえば、UITableViewControllerのサブクラスでは、次のようなことができます。

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *headerView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 40)];
    [headerView setBackgroundColor:[UIColor magentaColor]];
    [headerView setTextAlignment:NSTextAlignmentCenter];
    [headerView setText:@"Hello World"];
    [[self tableView] setTableHeaderView:headerView];
}

ヘッダービューは、ユーザーがスクロールすると非表示になります。なぜこれがこのように機能するのかはわかりませんが、あなたが望んでいることを達成しているようです。


これはセクション用ではなく、上部の1つのヘッダー用です。
マクダッド2013年

-1

多分あなたは単純にヘッダービューの背景を透明にすることができます:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    view.tintColor = [UIColor clearColor];
}

または、グローバルに適用します。

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];

-2

自動レイアウトなしで、すべてがXIBを介して実行される別のさらに簡単なソリューションがあります。

1 /テーブルビューに直接ドラッグアンドドロップして、ヘッダーをテーブルビューに配置します。

2 /新しく作成されたヘッダーのサイズインスペクターで、自動サイズ変更を変更します。上部、左、右のアンカーと水平方向の塗りつぶしだけを残します。

それはヘッダーに設定する方法です

これでうまくいくはずです!


-2

@samvermetteの回答によると、上記のコードをSwiftに実装して、コーダーが迅速に使用できるようにしています。

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

-2

ref:https : //stackoverflow.com/a/26306212

let tableView = UITableView(frame: .zero, style: .grouped)

ヒューズ

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 40
    }else{
        tableView.sectionHeaderHeight = 0
    }

    return 0
}

これはヘッダースペースの使用に役立ちました


、that🙏しないでください
MQoder

-3

2020最新アップデート

Xcode 14でテスト済み。

セクションヘッダーを非表示にするには、セクションデリゲートのタイトルにnilを返します

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

-4

これは、tableViewデリゲートクラスにviewForHeaderInSectionメソッドを実装することで簡単に実現できます。このメソッドは、戻りオブジェクト(ヘッダービュー)としてUIViewを想定しています。私は私のコードでこれと同じことをしました


オリジナルのポスターはカスタムヘッダーを必要としません。彼らは、表の上部に「浮かない」ヘッダーを求めています。あなたの提案はまだ浮かんでいます。
jemmons '19

tableforをviewforheaderでUITableViewStyleGroupedに変更すると、停止します
mskw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.