web-dev-qa-db-ja.com

ステータスバーをタップしてUITableViewの上部にスクロールします

テーブルビューを一番上にスクロールするコードがたくさんあることは知っていますが、Appleのネイティブアプリのように、一番上のステータスバーがタップされたときにこれを行いたいと思います。これは可能ですか?

57
Chase

これは無料で入手できますが、scrollsToTopUITableView属性がYESであることを確認する必要があります。

これが機能しないのは、UIScrollView(またはUITextViewなどの子孫クラス)オブジェクトが別のUIScrollViewクラス(UITableViewなど)に埋め込まれている場合です。この場合、埋め込みscrollsToTopクラスのUIScrollViewをNOに設定します。次に、ステータスバーのタップ動作が機能します。

149
Mark Granoff

Googleから来て、完全なチェックリストが必要な場合:

  1. UITableViewでscrollsToTop = YES(Markの提案による)を設定したことを確認します
  2. ウィンドウ内の他のすべてのUITableViews/UIScrollViews/UITextViewsでscrollsToTop = NOを設定して、クリックがインターセプトされないようにしてください。これをデバッグするために、ウィンドウ内のすべてのビューを何度も印刷していることに気付きました...
  3. テーブルビューがウィンドウ内の0/0(x/y座標)にあることを確認します-これにより、システムはメッセージを渡す必要があることを認識します
31
Zane Claes

他の回答で与えられた情報を使用して、UITableViewControllerに次のコードを追加して動作させます:

-(void)viewDidLoad 
 {
 [super viewDidLoad]; 
 
 for(UITextView * view in self.view.subviews){
 if([view isKindOfClass:[UITextView class]]){
 view.scrollsToTop = NO; 
} 
} 
 
 self.tableView.scrollsToTop = YES; 
} 

これは、UITableViewControllerの階層内のすべてのビューを調べ、タッチイベントをインターセプトしていたすべてのUITextViewsでscrollsToTopをオフにします。次に、tableViewが引き続きタッチを受信するようにしました。

これを変更して、同様にインターセプトしている他のUITableViews/UIScrollViews/UITextViewsを反復処理することができます。

お役に立てれば!

6
Brandon Roberts

私は同じ問題を抱えていましたが、次の手順で修正しました:

  1. 一番上までスクロールしたいテーブルビューに対してscrollsToTop = YESを設定します。
  2. 他のすべてのテーブルビューまたはコレクションビューまたはスクロールビューに対してscrollsToTop = NOを設定します。
  3. テーブルビューセルのいずれかにコレクションビューがある場合。コレクションビューに対してもscrollsToTopを必ずNOに設定してください。

View Controller/Navigation Controllerが別のView Controllerのサブビューとして追加されている場合は、必ず子Controllerとして設定してください。

6
iOS Developer

これはかなり古いものですが、これが役立つことを願っています。 @MarkGranoffが言ったことに続いて、複数のUIScrollViewまたはそのサブクラスがYES(デフォルト値)に設定されている場合、scrollsToTopは機能しません。健全性チェックは、おそらく誰が実際にこの動作を台無しにしているかをチェックする価値があります以下の簡単なメソッドは、ビューのサブビューをループし、ビュー内のすべてのUIScrollViewのscrollsToTop値を記録します。できれば、viewDidAppearメソッドで呼び出されます。

- (void)checkForScrollViewInView:(UIView *)view {
    for (UIView *subview in [view subviews]) {
        if ([subview isKindOfClass:[UIScrollView class]]) {
            NSLog(@"scrollsToTop enabled: %i in scroll view %@", ((UIScrollView *)subview).scrollsToTop, subview);
        }
        if (subview.subviews.count > 0) {
            [self checkForScrollViewInView:subview];
        }
    }
}

これはまさにデバッグコードです。 UIScrollViewサブクラスのそれぞれのscrollsToTop値を見つけたら、1つだけがYESに設定されていることを確認してください。

2
DennyLou

Markが言ったように、scrollsToTopプロパティがTRUEに設定されたUIScrollViewのサブクラス(通常はテーブルビュー)を1つだけ持つことができます。おそらく、ビューに他のUITextViewがあります。 scrollsToTopプロパティをFALSEに設定するだけで準備完了です。

2
George

UIScrollViewヘッダーファイル:

//ユーザーがステータスバーをタップすると、ステータスバーに最も近いタッチの下のスクロールビューが一番上にスクロールされますが、そのscrollsToTopプロパティがYESの場合のみ、デリゲートはNOを返しません。 shouldScrollViewScrollToTopで、まだ先頭にありません。 // iPhoneでは、scrollsToTop == YESのオンスクリーンスクロールビューが1つある場合にのみ、このジェスチャーを実行します。複数が見つかった場合、どれもスクロールされません。

1
foskon

複数のIScrollViewの子孫をロードできます。例:UITableViewを含む各ページにUIPageViewcontrollerを設定します。

scrollsToTopプロパティは、デフォルトではtrueです。

そのため、ネストされたUIScrollViewsのscrollsToTopプロパティを処理することに加えて、次のことを行う必要があります。

//When the view is loaded disable scrollsToTop, this view may not be the visible one
override func viewDidLoad() {
    super.viewDidLoad()
    ...
    tableView.scrollsToTop = false
}

//Now it's time to enable scrolling, the view is guaranteed to be visible
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    tableView.scrollsToTop = true
}

//Do not forget to disable scrollsToTop, making other visible UIScrollView descendant be able to be scrolled to top
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.tableView.scrollsToTop = false
}

この方法では、1つの最上位UITableViewのscrollsToTopのみがtrueに設定されます。

0
Géza Mikló

たとえば、このようなタグのようなテーブルビューとスクロールビューがある場合

enter image description here

viewDidLoadでこのようなものを作成する必要があります

self.tableView.scrollsToTop = true
self.tagsView.scrollsToTop = false
0
Abo3atef