最新のアプリでiOS7をターゲットにしていますが、ステータスバーをタップしても、tableViewまたはcollectionViewが一番上にスクロールされないようです。
self.tableView.scrollsToTop = true
を設定しましたが、まだ何も起こりません。
AppleはiOS7のステータスバーを大幅に変更しましたが、それらの変更はscrollsToTop
機能を壊しましたか?
更新
回答の1つにあるコメントに応えて、コレクションビューが実際に画面上の唯一のscrollViewであることを確認するためにテストしました。
(lldb) po [self.view recursiveDescription]
<UIView: 0x1092ddf0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x109357e0>>
| <UICollectionView: 0x11351800; frame = (0 0; 320 568); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x10966080>; layer = <CALayer: 0x109623a0>; contentOffset: {0, -64}> collection view layout: <UICollectionViewFlowLayout: 0x10940a70>
| | <UIImageView: 0x10965fa0; frame = (0 564.5; 320 3.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x10965ee0>> - (null)
| | <UIImageView: 0x10948f60; frame = (316.5 561; 3.5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x10966030>> - (null)
アップデート#2
重要かどうかはわかりませんが、ナビゲーションバーが透明で、コレクション/テーブルビューが下をスクロールするときにぼかしを適用する標準のiOS7NavigationControllerを使用しています。
アップデート#
理解した。 Ididの画面に複数のscrollViewがあることがわかりました。私のアプリには、アプリの主要部分の下に左側のドロワーメニューがあり、そのメニューにはオプションのtableViewがあります。 self.menuTable.scrollsToTop = false
を設定するだけで、アプリの残りの部分全体ですべてが期待どおりに機能しました。 scrollViewDelegateメソッドなどを実装する必要はありませんでした。
画面に複数のスクロールビュー/テーブルビュー/コレクションビューがありますか?その場合、そのうちの1つだけに scrollsToTop
をYES
に設定できます。そうしないと、iOS7はそれらを一番上にスクロールしません。
UIScrollViewDelegateメソッドを実装することもできます scrollViewShouldScrollToTop:
渡されたスクロールビューが上にスクロールしたいものと等しい場合はYESを返します。
- (BOOL) scrollViewShouldScrollToTop:(UIScrollView*) scrollView {
if (scrollView == self.myTableView) {
return YES;
} else {
return NO;
}
}
簡単に言うと、iOS7でも違いはありません。ロードされているUIScrollViewが複数ない限り、ユーザーがステータスバーをタップすると、tableViewまたはcollectionViewが一番上にスクロールします。ここのキーがロードされます。別のscrollViewと競合するために、別のscrollViewが必ずしも画面上にある必要はありません。
最近は左右のスライド式引き出しが人気で、これが私の悩みの種でした。ナビゲーションオプションを含むメニューがあり、これらはすべてUITableViewによって保持されます。アプリの他の部分で動作させる前に、menuTable.scrollsToTop = false
を設定していることを確認する必要がありました。
私の問題は、UITextView
がscrollsToTop
に設定されたYES
を持っていたため、UITableView
がジェスチャーに応答しなかったことです。つまり、他のすべてのスクロール可能なビューを確認してください。
テーブルセルが動的である場合は、以下を削除します。
_- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
return YES;
}
_
次のように新しい関数を作成します。
_- (void) disableScrollsToTopPropertyOnAllSubviewsOf:(UIView *)view {
for (UIView *subview in view.subviews) {
if ([subview isKindOfClass:[UIScrollView class]]) {
((UIScrollView *)subview).scrollsToTop = NO;
}
[self disableScrollsToTopPropertyOnAllSubviewsOf:subview];
}
}
_
上記の関数を- (void)viewDidLoad
で呼び出します
_[self disableScrollsToTopPropertyOnAllSubviewsOf:self.view];
_
次に、次のようにテーブルビューのScrollsToTopを有効にします。
_[myTableView setScrollsToTop:YES];
_
ほかの人のため :
検索しているスクロールビューは、UITableViewだけでなくUIWebViewでもかまいません。もう1つの重要なことは、VISIBLE scrollViewsだけでなく、LOADEDscrollviewsについても重要です。
ScrollViewが見つからない場合は、アプリの起動直後にUITableViewテストテーブルをいつでも挿入できます。アプリが上にスクロールするかどうかを確認し、テストテーブルが上にスクロールしなくなるまで、さらに多くのビューを読み込みます。