2013-02-07 5 views
9

iPhoneの連絡先アプリで検索バーのスティッキーな動作を再現したいと思います。ネイティブ連絡先アプリと同様のスティッキー検索バーとセクションヘッダーの動作

Normal stage

ときにユーザーがスクロールダウンビュー、検索バーは、ビューと一緒にダウン来る:

User scrolls the view down

ユーザーがスクロールアップ、テーブルのスクロールに応じた場合、

(1)検索バーには、が先頭に固定されます。、及び
(2)後続のセクションヘッダーを適切検索バー下に停止:

User scrolls up

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

User scroll up

注:セクションインデックスコントロール(右側のaz)はの上に表示されます。も同様である。 Ergoは、contentInsetで手を加えて、セクションインデックスコントロールをそれに沿って押し下げます。

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

私はこの問題の解決策に感謝します。

+0

検索バーを配置するのは簡単な部分です。コンテンツの挿入図を使用して、セクションヘッダーを適切な位置に停止させることができます。難しい部分は、(1)新しいセクションヘッダーが前に横切らないように検索バーを前方に持っていく必要があること、(2)コンテンツに対抗するためにインデックスを大きくする方法を理解できないことインセット私は、AppleがAPIにアクセスしているとは思えない。おそらく – matt

+0

。私は最初に、 'UITableView'の内部動作を試してみて、' UITableViewIndex'にアクセスして、その位置+動作を変更していたはずです。しかし、それはAppleがAPIのそのような露骨な乱用をおそらく拒否するように、助言されている。 – krisk

+0

私はあなたがしたいことをする方法がないと結論づけなければならないと思う。すべきだ!これは、検索フィールドを簡単に見つけることができるため、優れたインターフェースです。改善を求めるバグレポートを提出することをお勧めします。その間、検索バーはテーブルビューの一部ではなく、iPad上のメールアプリケーションで使用されるインターフェイスをお勧めします。私はそれを達成する方法を知っています! :) – matt

答えて

16

すべてのことを正しく行うにはかなりの作業が必要でしたが、その動作を再現することができることを証明しなければなりませんでした。少なくともです。調整-scrollViewDidScroll:で)テーブルビューに直接検索バーを追加してのtableViewのcontentInset
2セット)
1:https://github.com/fabiankr/TableViewSearchBar

を実際に、それはそれさえも複雑ではありません:
は、私が作成したこのGitHubのプロジェクトがチェックアウト検索バーのフレーム

ただし、注意が必要な注意点があります。
1)テーブルビューを上にスクロールすると、セクションバーが検索バーのすぐ上に表示されます。これを解決するには、検索バーの
にスクロールするときに検索バーのzPositionを設定してください。UISearchDisplayControllerがコントローラのビューにディミング表示を追加するため、コンテンツコントローラはUITableViewControllerの代わりにUIViewControllerのサブクラスである必要があります。テーブルビューコントローラーのviewはテーブルビューであるため、テーブルビューがスクロールされると、表示が間違った位置に表示されます。

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

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

+1

** + 1 **はプライベートメソッドです。それが公開されることを望みましょう、これは便利なことです。誰かが本当に_realy_がインデックスを重複させたいのであれば、自分で作ってください。それは難しいことではありません。 – Tricertops

0

私はこの動作を実現方法は、私のUITableView浮動セルフォームを取り外し、それのUITableViewのサブビューすることによってだったとscrollViewDidScroll中の浮遊細胞をアニメ化。 そして、UITableViewが浮動小数点セルを表示するのに十分遠くまでスクロールするので、scrollViewDidScrollが呼び出されたときに浮動小数点セルによって覆われた非表示のセルがtableviewにも貼り付けられました。

- (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; 
} 

あなたはそうスクロール時の浮遊細胞がジャンプするように表示されませんが、これは屋を始める必要があるカップルのコーナーケース条件を追加する必要があります。がんばろう!

+0

これは正しいものではありません。セクションのヘッダーはまだテーブルの上部に移動します。彼らはOPによって要求されるように、検索バーの下で停止しません。また、コンテンツインセットを使用してそれを修正しようとすると、セクションインデックスが短すぎます。連絡先アプリのように検索バーと重複しません。したがって、このコードは、OPがもたらした問題を正確に解決することができません。 – matt

+0

あなたは@mattが正しいです。痛みポイントは、セクションヘッダーとセクションインデックスコントロールを処理しています。 – krisk

関連する問題