9

iPhone の連絡先アプリの検索バーのスティッキーな動作を再現したいと考えています。

通常ステージ

ユーザーがビューを下にスクロールすると、ビューとともに検索バーも下に表示されます。

ユーザーはビューを下にスクロールします

ユーザーが上にスクロールすると、それに応じてテーブルがスクロールし、次の 2 つの動作が行われます。

(1) 検索バーは上部に固定されたままであり、
(2)後続のセクション ヘッダーは検索バーの下で適切に停止します

ユーザーが上にスクロール

次のセクション ヘッダーが来ると、前のヘッダーは検索バーの下に消えます。

ユーザーが上にスクロール

注: セクション インデックス コントロール (右側の az)も検索バーの上部に表示されます。したがって、 をいじるとcontentInset、セクション インデックス コントロールが一緒に押し下げられます。

カスタム を作成しUIViewController、 を追加し、検索バーの高さにUITableView設定しました。contentInsetを作成しUIView、検索バーをそのサブビューとして追加してから、 を に追加しUIViewましたUITableView。ただし、前述のように、ユーザーがスクロールすると、セクション ヘッダーはヘッダーの高さではなく、y 位置のゼロに固定されます。さらに、セクション ヘッダー インデックスの制御位置が悪影響を受けます。

この問題の解決策をいただければ幸いです。

4

2 に答える 2

15

すべてを正しくするにはかなりの作業が必要でしたが、その動作を少なくともほぼ再現できることを証明する必要がありました。
私が作成したこの GitHub プロジェクトをチェックしてください: https://github.com/fabiankr/TableViewSearchBar

実際には、それほど複雑ではありません:
1) 検索バーをテーブル ビューに直接追加し、tableView を設定しますcontentInset
2)-scrollViewDidScroll:検索バーのフレームを調整します

ただし、注意が必要な点がいくつかあります
。1) テーブル ビューを一番上までスクロールすると、セクション ヘッダーが検索バーのすぐ上に表示されます。それを解決するには、一番上にスクロールするときに検索バーをzPosition設定し
ます。テーブル ビュー コントローラーはテーブル ビューであるため、テーブル ビューをスクロールすると、減光ビューが間違った位置に表示されます。UIViewControllerUITableViewControllerUISearchDisplayControllerview

パブリック API のみを使用してできないことの 1 つは、テーブルの右側にあるセクション インデックス コントロールを検索バーに重ねることです。これはほんの些細なことであり、それがなくても動作は連絡先アプリに見られるものと非常に似ています.

まったく同じ動作を実現するには、プライベート API を使用する必要があります。使用する必要があるUITableView呼び出されたメソッドがあります。_setPinsTableHeaderView:サンプル プロジェクトには、1) パブリック API のみ、および 2) 検索バーに重なるセクション インデックス コントロールを取得するためのプライベート API の両方の実装が含まれています。
注意: アプリを App Store に提出する予定がある場合は、プライベート API を使用しないでください。

于 2013-02-10T14:54:43.560 に答える
0

この動作を実現する方法は、フローティングセルをUITableViewから切り離し、UITableViewのサブビューにして、scrollViewDidScrollでフローティングセルをアニメーション化することでした。また、UITableViewが十分に下にスクロールしてフローティングセルが表示されるように、scrollViewDidScrollが呼び出されたときにフローティングセルで覆われる非表示のセルをテーブルビューに貼り付けました。

- (void)viewDidLoad {
   // add floating cell to tableview
   FloatingCell *cell = [[FloatingCell alloc] init];
   [self.tableView addSubview:cell];
   self.floatingCell = cell; 
}
// overwrite scrollViewDidScroll
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGRect floatingCellFrame = floatingCell.frame;
    CGFloat floatingCellHeight = floatingCellFrame.size.height;

    // when contentOffset is is more then cellHeight scroll floating cell
    if (scrollView.contentOffset.y > floatingCellHeight) {
       floatingCellFrame.origin.y = -scrollView.contentOffset.y + floatingCellHeight; 

    // when contentOffset is less then cellHeight stick it to the top of UITableView
    else if (scrollView.contentOffset.y < floatingCellHeight)
       floatingCellFrame.origin.y = 0;

   floatingCell.frame = floatingCellFrame;
}

スクロールするときにいくつかのコーナーケース条件を追加して、フローティングセルがジャンプしていないように見えるようにする必要があるかもしれませんが、これで開始できます。幸運を!

于 2013-02-07T20:50:58.897 に答える