web-dev-qa-db-ja.com

スクロールするToTopをiOS7で動作させることができません

最新のアプリで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メソッドなどを実装する必要はありませんでした。

24
djibouti33

画面に複数のスクロールビュー/テーブルビュー/コレクションビューがありますか?その場合、そのうちの1つだけに scrollsToTopYESに設定できます。そうしないと、iOS7はそれらを一番上にスクロールしません。

UIScrollViewDelegateメソッドを実装することもできます scrollViewShouldScrollToTop: 渡されたスクロールビューが上にスクロールしたいものと等しい場合はYESを返します。

- (BOOL) scrollViewShouldScrollToTop:(UIScrollView*) scrollView {
    if (scrollView == self.myTableView) {
        return YES;
    } else {
        return NO;
    }
}
23
Greg

簡単に言うと、iOS7でも違いはありません。ロードされているUIScrollViewが複数ない限り、ユーザーがステータスバーをタップすると、tableViewまたはcollectionViewが一番上にスクロールします。ここのキーがロードされます。別のscrollViewと競合するために、別のscrollViewが必ずしも画面上にある必要はありません。

最近は左右のスライド式引き出しが人気で、これが私の悩みの種でした。ナビゲーションオプションを含むメニューがあり、これらはすべてUITableViewによって保持されます。アプリの他の部分で動作させる前に、menuTable.scrollsToTop = falseを設定していることを確認する必要がありました。

11
djibouti33

私の問題は、UITextViewscrollsToTopに設定されたYESを持っていたため、UITableViewがジェスチャーに応答しなかったことです。つまり、他のすべてのスクロール可能なビューを確認してください。

7
Jeffrey Sun

テーブルセルが動的である場合は、以下を削除します。

_- (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];
_
4
AshMan

ほかの人のため :

検索しているスクロールビューは、UITableViewだけでなくUIWebViewでもかまいません。もう1つの重要なことは、VISIBLE scrollViewsだけでなく、LOADEDscrollviewsについても重要です。

ScrollViewが見つからない場合は、アプリの起動直後にUITableViewテストテーブルをいつでも挿入できます。アプリが上にスクロールするかどうかを確認し、テストテーブルが上にスクロールしなくなるまで、さらに多くのビューを読み込みます。

4
user1105951