テーブルビューを一番上にスクロールするコードがたくさんあることは知っていますが、Appleのネイティブアプリのように、一番上のステータスバーがタップされたときにこれを行いたいと思います。これは可能ですか?
これは無料で入手できますが、scrollsToTop
のUITableView
属性がYESであることを確認する必要があります。
これが機能しないのは、UIScrollView
(またはUITextViewなどの子孫クラス)オブジェクトが別のUIScrollView
クラス(UITableView
など)に埋め込まれている場合です。この場合、埋め込みscrollsToTop
クラスのUIScrollView
をNOに設定します。次に、ステータスバーのタップ動作が機能します。
Googleから来て、完全なチェックリストが必要な場合:
他の回答で与えられた情報を使用して、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を反復処理することができます。
お役に立てれば!
私は同じ問題を抱えていましたが、次の手順で修正しました:
View Controller/Navigation Controllerが別のView Controllerのサブビューとして追加されている場合は、必ず子Controllerとして設定してください。
これはかなり古いものですが、これが役立つことを願っています。 @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に設定されていることを確認してください。
Markが言ったように、scrollsToTopプロパティがTRUEに設定されたUIScrollViewのサブクラス(通常はテーブルビュー)を1つだけ持つことができます。おそらく、ビューに他のUITextViewがあります。 scrollsToTopプロパティをFALSEに設定するだけで準備完了です。
UIScrollViewヘッダーファイル:
//ユーザーがステータスバーをタップすると、ステータスバーに最も近いタッチの下のスクロールビューが一番上にスクロールされますが、その
scrollsToTop
プロパティがYESの場合のみ、デリゲートはNOを返しません。shouldScrollViewScrollToTop
で、まだ先頭にありません。 // iPhoneでは、scrollsToTop
== YESのオンスクリーンスクロールビューが1つある場合にのみ、このジェスチャーを実行します。複数が見つかった場合、どれもスクロールされません。
複数の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に設定されます。