0

テーブルのヘッダー ビューに UISearchBar があります。行の削除や挿入など、アニメーションが発生するたびに、ヘッダー ビューが下にスクロールします。ヘッダー ビューを (自動的に) スクロールしないようにテーブル ビューに指示する方法はありますか? (ユーザーのみが下にスライドできる必要があります。)

4

1 に答える 1

0

Google と StackOverFlow で広範な検索を行った結果、正しい手がかりが見つかりましたUIScrollView。私が探していて最終的に実装された実際の解決策は、別の質問で見つけることができます: UITableViewセクションヘッダーのデフォルトのスクロール動作を変更する

次のプロパティを持つように、ソリューションを少しカスタマイズしました。

  • 行のアニメーションは、ヘッダー ビューが表示されない限り、テーブル ビューを下にスクロールできます。
  • 上部をクリックすると ("scroll to top")、ヘッダー ビューを除いて、テーブル ビューが上部にスクロールされます。
  • ヘッダー ビューが部分的に表示されている場合は、下にスライドする必要があるため、完全に表示されます

このソリューションのコード:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat searchBarHeight = self.searchBar.frame.size.height;
    if (scrollView.contentOffset.y >= searchBarHeight) {
        scrollView.contentInset = UIEdgeInsetsMake(-searchBarHeight, 0, 0, 0);
    } else {
        scrollView.contentInset = UIEdgeInsetsZero;
    }
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (scrollView.contentOffset.y < self.searchBar.frame.size.height && scrollView.contentOffset.y > 0) {
        [scrollView setContentOffset:CGPointZero animated:YES];
    }
}

このコードはUITableViewController、 のデリゲートとして機能する内に実装されUITableViewます。UITableView反対側の は を継承しているため、UIScrollViewこれらのメソッドが使用可能になり、すべての魔法が実行されます。

contentOffsetとを説明するいくつかの文contentInsetで、その意味を理解するのにしばらく時間がかかりました。

  • オフセットは です。CGPointこれは、表示されているコンテンツ、つまりテーブル ビューのセクションとセルが左上隅からどれだけ下にスクロールされているかを示します。ヘッダー ビューとフッター ビューが含まれているため、(0, 0) のオフセットは、テーブル ビューが一番上にスクロールされることを示します。(0, 100) のオフセットは、テーブル ビューが 100px 下にスクロールされることを意味します (通常、ポイントの x 値は使用されません)。
  • 挿入図は非常に興味深いプロパティで、 の境界をUIScrollViewquadrupel として定義し(top, left, bottom, right)ます。したがって、これらの境界を超えると、テーブル ビューが跳ね返ります。デフォルト値は (0, 0, 0, 0) です。これは、最初のセルまたは最後のセルの上または下にスクロールすると、テーブル ビューが跳ね返ることを意味します。したがって、値 (-44, 0, 0, 0) を指定すると、バウンス境界がテーブル ビューの起点から 44 ピクセル下に下がります。私のヘッダー ビューの高さは 44 ピクセルなので、ヘッダー ビューを画面の表示部分にスクロールするたびに跳ね返ります。これにより、行のアニメーションがテーブルをオフセット (44, 0) より下にスライドすることも防止され、「上にスライド」コマンドはテーブル ビューをオフセット (44, 0) にスライドします。

それが役立つことを願っています。:)

于 2012-05-03T18:28:01.480 に答える