152

2 つのセクションを持つ UITableView があります。シンプルなテーブルビューです。これらのヘッダーのカスタム ビューを作成するために、viewForHeaderInSection を使用しています。ここまでは順調ですね。

デフォルトのスクロール動作では、セクションに遭遇すると、次のセクションがスクロールして表示されるまで、セクション ヘッダーがナビゲーション バーの下に固定されたままになります。

私の質問は次のとおりです。セクション ヘッダーが上部に固定されたままではなく、残りのセクション行と共にナビゲーション バーの下をスクロールするように、デフォルトの動作を変更できますか?

明らかな何かが欠けていますか?

ありがとう。

4

19 に答える 19

175

この問題を解決する方法は、次のように(extends )contentOffsetに従って を調整することです。contentInsetUITableViewControllerDelegateUIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
       CGFloat sectionHeaderHeight = 40;
   if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
       scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
   } else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
       scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
   }
}

ここでの唯一の問題は、スクロールして一番上に戻るときに少しバウンスが失われることです。


{注: 「40」はセクション 0 ヘッダーの正確な高さである必要があります。セクション 0 ヘッダーの高さよりも大きい数値を使用すると、指の感触が影響を受けることがわかります (「1000」のように試してみると、バウンス動作が上部で奇妙なものになることがわかります)。数値がセクション 0 ヘッダーの高さと一致する場合、指の感触は完璧またはほぼ完璧に見えます。}

于 2010-10-21T05:36:49.160 に答える
86

上部に行が 0 のセクションを追加して、前のセクションのフッターを次のヘッダーとして使用することもできます。

于 2011-02-26T15:14:03.477 に答える
36

私がこれを行うとしたら、Plain スタイルの UITableView にはスティッキー ヘッダーがあり、Grouped スタイルの UITableView にはないという事実を利用します。少なくともカスタム テーブル セルを使用して、グループ化されたテーブルのプレーン セルの外観を模倣してみます。

私は実際にこれを試していないので、うまくいかないかもしれませんが、それは私がやることをお勧めします.

于 2009-12-20T08:54:04.330 に答える
28

遅くなることはわかっていますが、決定的な解決策を見つけました!

セクションが 10 個ある場合、dataSource が 20 を返すようにします。セクション ヘッダーには偶数を使用し、セクション コンテンツには奇数を使用します。このようなもの

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }else {
        return 5;
    }
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        return [NSString stringWithFormat:@"%i", section+1];
    }else {
        return nil;
    }
}

出来上がり!:D

于 2011-12-02T00:28:47.500 に答える
16

最初に投稿されたここ、IBを使用した簡単なソリューション。非常に簡単ですが、同じことをプログラムで行うことができます。

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

UIView を TableView にドラッグして、ヘッダー ビューにします。

  1. そのヘッダー ビューの高さを 100px に設定します
  2. tableview contentInset (上) を -100 に設定します。
  3. セクション ヘッダーは、通常のセルと同じようにスクロールするようになりました。

このソリューションは最初のヘッダーを非表示にするという意見もありましたが、私はそのような問題に気づいていません。それは私にとって完璧に機能し、これまでに見た中で最も簡単なソリューションでした.

于 2013-01-30T17:12:02.373 に答える
15

TableView スタイルを変更するだけです:

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

UITableViewStyle ドキュメント:

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

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

于 2015-07-14T21:36:00.883 に答える
15

ここで説明した解決策には満足できなかったので、それらを組み合わせてみました。結果は、@awulf と @cescofry に触発された次のコードです。実際のテーブルビューヘッダーがないため、うまくいきます。既にテーブル ビュー ヘッダーがある場合は、高さを調整する必要がある場合があります。

// Set the edge inset
self.tableView.contentInset = UIEdgeInsetsMake(-23.0f, 0, 0, 0);

// Add a transparent UIView with the height of the section header (ARC enabled)
[self.tableView setTableHeaderView:[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 23.0f)]];
于 2013-02-28T18:50:28.887 に答える
15

この問題を非ハッキーな方法で解決するには、いくつかのことを行う必要があります。

  1. テーブル ビュー スタイルをUITableViewStyleGrouped
  2. テーブル ビューbackgroundColor[UIColor clearColor]
  3. backgroundView各テーブルビューのセルを空のビューに設定しますbackgroundColor [UIColor clearColor]
  4. 必要に応じて、テーブル ビューを適切に設定するか、個々の行の高さが異なる場合はrowHeightオーバーライドします。tableView:heightForRowAtIndexPath:
于 2011-08-01T16:13:47.353 に答える
5

テーブルのheaderViewを、断面図のヘッダーと同じ高さの透明なビューに設定します。また、-heightのayフレームでテーブルビューを開始します。

self.tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, - height, 300, 400)];

UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)] autorelease];
[self.tableView setTableHeaderView:headerView];
于 2011-08-11T14:37:09.363 に答える
5

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

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

UITableView の Apple ドキュメントによると:

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

UITableViewStyleGrouped - セクションが個別の行グループを表すテーブル ビュー。セクションのヘッダーとフッターはフローティングしません。この小さな変更がお役に立てば幸いです..

于 2016-05-08T02:30:39.357 に答える
4

別の解決策を見つけました。実際のヘッダーセクションの代わりに各セクションの最初のセルを使用します。このソリューションはそれほどきれいに見えませんが、うまく機能します。ヘッダーセクションに定義済みのプロトタイプセルを使用できます。メソッドcellForRowAtIndexPathでindexPath.row == 0を要求します。trueの場合は、ヘッダーセクションのプロトタイプセルを使用します。それ以外の場合は、デフォルトのプロトタイプセルを使用します。

于 2012-10-19T16:46:08.053 に答える
2

グループ化されたスタイルは基本的に iOS 7 のプレーン スタイルと同じように見えるので (平面性と背景の点で)、私たちにとって最善かつ最も簡単な (つまり、最もハッキリした) 修正は、テーブル ビューのスタイルをグループ化に変更することでした。上部にスクロール アウェイ ナビゲーション バーを統合したとき、contentInsets によるジャッキングは常に問題でした。グループ化されたテーブル ビュー スタイルでは、(セルに関して) まったく同じように見え、セクション ヘッダーは固定されたままです。スクロールの奇妙さはありません。

于 2014-04-09T00:40:48.490 に答える
1

tableView に負のインセットを割り当てます。高さ 22px のセクション ヘッダーがあり、固定したくない場合は、reloadData の直後に次を追加します。

self.tableView.contentInset = UIEdgeInsetsMake(-22, 0, 0, 0); 
self.tableView.contentSize = CGSizeMake(self.tableView.contentSize.width, self.tableView.contentSize.height+22); 

私にとって魅力のように機能します。セクション フッターにも機能します。代わりに、下部に負のインセットを割り当てるだけです。

于 2010-10-08T22:22:32.797 に答える
0

ここで私の答えを確認してください。これは、ハッキングなしで非フローティングセクションヘッダーを実装する最も簡単な方法です。

于 2012-12-06T01:23:30.273 に答える
0

テーブルを Scroll View に追加すると、うまくいくようです。

于 2010-05-10T00:11:43.223 に答える
0

@awulfの回答の迅速なバージョン。

func scrollViewDidScroll(scrollView: UIScrollView) {
    let sectionHeight: CGFloat = 80
    if scrollView.contentOffset.y <= sectionHeight {
        scrollView.contentInset = UIEdgeInsetsMake( -scrollView.contentOffset.y, 0, 0, 0)
    }else if scrollView.contentOffset.y >= sectionHeight {
        scrollView.contentInset = UIEdgeInsetsMake(-sectionHeight, 0, 0, 0)
    }
}
于 2016-09-07T16:50:15.620 に答える
-2

tableHeaderViewプロパティを設定するだけでそれができることを学びました。

 tableView.tableHeaderView = customView;

以上です。

于 2012-01-23T12:19:34.693 に答える