テーブルのヘッダー ビューに UISearchBar があります。行の削除や挿入など、アニメーションが発生するたびに、ヘッダー ビューが下にスクロールします。ヘッダー ビューを (自動的に) スクロールしないようにテーブル ビューに指示する方法はありますか? (ユーザーのみが下にスライドできる必要があります。)
質問する
685 次
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 値は使用されません)。 - 挿入図は非常に興味深いプロパティで、 の境界を
UIScrollView
quadrupel として定義し(top, left, bottom, right)
ます。したがって、これらの境界を超えると、テーブル ビューが跳ね返ります。デフォルト値は (0, 0, 0, 0) です。これは、最初のセルまたは最後のセルの上または下にスクロールすると、テーブル ビューが跳ね返ることを意味します。したがって、値 (-44, 0, 0, 0) を指定すると、バウンス境界がテーブル ビューの起点から 44 ピクセル下に下がります。私のヘッダー ビューの高さは 44 ピクセルなので、ヘッダー ビューを画面の表示部分にスクロールするたびに跳ね返ります。これにより、行のアニメーションがテーブルをオフセット (44, 0) より下にスライドすることも防止され、「上にスライド」コマンドはテーブル ビューをオフセット (44, 0) にスライドします。
それが役立つことを願っています。:)
于 2012-05-03T18:28:01.480 に答える