UIWebViewがpushViewControllerで使用されている場合、scrollsToTopは機能せず、解決策を探しています
質問
Navigation ControllerのルートにTable Viewを備えたアプリがあり、Table Cellを選択すると、UIWebViewのみを含む新しいView Controllerが表示されます(ツールバーとナビゲーションバー付き)。
新しいWebビューの表示方法に応じて、ユーザーが上部のステータスバーをタップし、Webビューを上部にスクロールできる機能は、動作するか動作しないかのいずれかです。
使用する場合:
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
RootViewで、WebViewが上部にスクロールします。
その1行のコードを変更して代わりに使用する場合:
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
Navigation Controllerで、scrollsToTop機能の動作が停止します。
ただし、アプリのコンテキストの他の理由で、本当に使用したいのはpushViewControllerメソッドです。しかし、私はscrollsToTopの振る舞いも維持したいです。
これまでにさまざまなアプローチを試してきましたが、その一部を以下に説明します:
-webviewの内部scrollView scrollsToTopプロパティを設定しようとしています
((UIScrollView *)[[webView valueForKey:@"_internal"] valueForKey:@"scroller"]).scrollsToTop = YES;
(認識できる影響なし)。
-NavBarプロパティを設定する順序を変更するか、まったく設定しない -余分な「ウィンドウmakeKeyAndOrderFront」を追加新しいビューのプッシュ後に呼び出します。
「scrollsToTop」を主張する可能性のある他のビューがあるとは思わない。プロパティ(および上記の最初のテストは、いずれの場合でもそれを証明します)。
UIWebViewをUIScrollViewに埋め込むのは短すぎますが、これは痛みを伴うと思われますが、この問題を解決するために探索するルートが不足しています。
他の誰かがこれを修正する方法を見つけてくれることを望んでいますか?
解決 2
Navbarをカスタマイズしていたために、機能していなかったことがわかりました。私はleftBarButtonItemをUIBarButtonItemでオーバーライドし、次にnavbar全体を使用していました(何ヶ月も前にAppleのコードからそのアプローチを取ったと思いますが、確かではありません)。別のビューで同じアプローチを使用していましたが、そこでscrollsToTopは正常に機能しました。
そのコードを取り出して、カスタムNavbarビューを(たとえば)self.navigationController.titleViewに配置することで、代わりにこの問題を解決しました。他のビューでもうまくいくと言っているように、なぜかはわかりません。
この問題で多くの時間を無駄にしたので、他の人にここで説明して髪を節約したいと思います:)
他のヒント
回避策として逆のアプローチを試してください。
ルートView Controllerで:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.tableView.scrollsToTop = NO;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.tableView.scrollsToTop = YES;
}
バイ!