ドロップインビューを表示すると、常にテーブルビューを一番上にスクロールするように思えます。その場合、これを行うより良い方法があります。
UITableView
はcontentInset
プロパティを継承します。UIScrollView
です。 contentInset
プロパティは、スクロールビューの各端に境界線を定義します。各境界線には独自の太さがあり、デフォルトではゼロです。これらの罫線は、スクロールビューがコンテンツをスクロールできるようにするための距離に影響します。コンテンツを隠すことはありません。一番上のインセットをゼロより大きく設定し、スクロールビューに負のY起点を持つサブビューを与えると、そのサブビューは境界線に表示され、スクロールビューの残りのコンテンツとともにスクロールします。
したがって、テーブルビューの一番上のインセットをドロップインビューの高さに設定し、ドロップインビューをテーブルビューのサブビューとして追加し、その起点を高さの負数に設定します。これにより、テーブルビューの最初の行の上の画面に完全に収まるようになり、テーブルビューとともにスクロールします。ドロップインビューが完全に画面外にスクロールされたことを検出すると、テーブルビューから削除し、テーブルビューの一番上のインセットを0に戻すことができます。私はちょうどドロップでビューをトリガーするボタンを使用し、私のテストプロジェクトで
typedef enum {
DropInViewStateHidden,
DropInViewStateAppearing,
DropInViewStateVisible
} DropInViewState;
@implementation ViewController {
DropInViewState _dropInViewState;
}
:
は、我々はドロップインビューの現在の状態を追跡するインスタンス変数が必要になります。
- (IBAction)dropIn {
if (_dropInViewState != DropInViewStateHidden)
return;
CGRect frame = self.dropInView.frame;
frame.origin.y = -frame.size.height;
self.dropInView.frame = frame;
[self.tableView addSubview:self.dropInView];
self.tableView.contentInset = UIEdgeInsetsMake(frame.size.height, 0, 0, 0);
[self.tableView setContentOffset:frame.origin animated:YES];
_dropInViewState = DropInViewStateAppearing;
}
テーブルビューがスクロールすると、ドロップインビューの状態がチェックされます。それが「可視」状態にあり、画面外にスクロールされている場合は、非表示にします。ドロップインビューを表示して画面上にスクロールすると、ドロップインビューが非表示になっていると思われるメッセージscrollViewDidScroll:
を受け取ることができるので、面倒なことがあります。そのため、DropInViewStateAppearing
の状態から始めて、ビューが現れたことがわかったらDropInViewVisible
状態に移行するのはこのためです。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
switch (_dropInViewState) {
case DropInViewStateHidden:
break;
case DropInViewStateVisible:
if (scrollView.contentOffset.y >= 0) {
// dropInView has been scrolled off-screen
self.tableView.contentInset = UIEdgeInsetsZero;
[self.dropInView removeFromSuperview];
_dropInViewState = DropInViewStateHidden;
break;
}
case DropInViewStateAppearing:
// When I first add dropInView to tableView and tell tableView
// to scroll to reveal dropInView, I may get a bunch of
// scrollViewDidScroll: messages with contentOffset.y >= 0.
// I don't want those messages to hide dropInView, so I sit in
// DropInViewStateAppearing until contentOffset.y goes negative,
// which means at least part of dropInView is actually on-screen.
if (scrollView.contentOffset.y < 0)
_dropInViewState = DropInViewStateVisible;
break;
}
}
私は検索バーともその上のインセットエリアの競合プルにリフレッシュものを持っているので、私は製図板ではまだだけど、良い、徹底的な答えてくれてありがとう。 – danh