0

UIScrollView 内に UISearchBar があります (正確には AQGridView)。これで、searchBar は最初は非表示になります (たとえば、ミュージック アプリで見られるように)。UIScrollViews にはヘッダー ビューがないため、UIScrollView のフレームの外側に -40 ポイント配置し、contentInset を 40 ポイントに設定しました。

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.f, -40.f, 320.f, 40.f)];
gridView.contentInset = UIEdgeInsetsMake(0.f, 40.f, 0.f, 0.f);

今、私が望んでいることをほぼ正確に行う外観と一般的な動作から. 検索バーは非表示になっていますが、上にスクロールして表示できます。

これが問題です:

検索バーに触れてフォーカスを与え、テキストを入力すると、検索バーが完全に表示されていない場合を除いて、すべて正常に機能します。その場合、UIScrollView は自動的にスクロールして完全に表示されるようにします。ただし、間違った方向にスクロールします。

たとえば、検索バーの上部にある 10 個のポイントが非表示になっている場合、スクロール ビューは上ではなくにスクロールします。

これは少しあいまいな質問かもしれませんが、誰かがここで私の間違いを伝えることができるかもしれません.ここで見つけた唯一のスレッドはこれでした.

4

2 に答える 2

4

私はほぼ同じ問題に遭遇しました.CodaFiのソリューションは私の問題を解決できません. したがって、この解決策が正しい答えであるとは思えません。

私の状況と問題の説明は次のとおりです。UINavigationBar を ContentInset 領域に追加し、UIWebView を UIScrollView の ContentSize 領域に追加して、UINavigationBar が画面の上部の外にある Web コンテンツと一緒にスクロールダウンできるようにします。また、UINavigationBar 内にも、1 つの UITextField と 1 つの UISearchBar を追加しました (はい、Safari と同じです)。コードの設定の一部に続きます(viewDidLoad:メソッド内):

navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, -64, 320, 64);
textfield = [[UITextField alloc] initWithFrame:CGRectMake(5, 23, 150, 30)];
[navigationBar addSubview:textfield];
searchbar = [[UISearchBar alloc] initWithFrame:CGRectMake(200, 23, 100, 30)];
[navigationBar addSubview:searchbar];
[self.webView.scrollView setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)];
[self.webView.scrollView setContentOffset:CGPointMake(0, -64) animated:NO];
[self.webView.scrollView addSubview:navigationBar];

問題は、テキストフィールドまたは検索バーをクリックすると、ナビゲーションバー (実際にはビュー全体) が画面に表示されることです: テキストフィールドが 41 ポイント、検索バーが 42 ポイント (変です!)。そのため、画面の上部に 0 ~ 41 (または 42) ポイントの不思議な空白が残ります。そしてもう1つの奇妙なことは、それが一度しか起こらないということです! 画面を指でスクロールした後、テキストフィールドまたは検索バーをクリックすると、画面が消えて二度と表示されません。私の問題の本質は、デニスの問題と同じだと思います。

Web で 2 日間検索した後、残念ながら、この問題の本質を解決するための完璧な解決策を見つけることができませんでした (実際、問題の本質についてはよくわかりません...)。

しかし、私が実験して観察したように、テキストフィールドが下に移動した41ポイントは、ナビゲーションバーに設定されている相対位置(-64 + 23 = -41)が原因である可能性があると思います。そして、ユーザーがクリックすると、システム(iOS)がその位置をチェックし(viewDidLoadで-64でcontentOffsetを設定しましたが)、ユーザーの範囲内にないことを確認し、スクロールビューを強制的に下にスクロールさせますそれは現れます(下向きに41ポイント)。私たち(開発者)がコンテンツインセット領域を設定してそれを操作すると、スクロールビューの動作が理解できません。それについて話している文書や参考文献は本当にほとんどありません。私の仮定が間違っていて、誰かが将来私を訂正して、真実を見つけるのを手伝ってくれたらいいのにと思います.

最後に、「本当の」答えを見つけることはできませんでしたが、実際にこの問題の解決策を見つけました (症状を治すための救済策のように)。コードは次のとおりです。

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y < -64) {    // if it is beyond the contentInset area
        if (!scrollView.dragging && !scrollView.decelerating) {    // scrollView is operated by system
            [scrollView setContentOffset:CGPointMake(0, -64) animated:NO];  // freeze the screen at (0, -64) position
        }
    }
}
于 2012-08-12T11:40:25.287 に答える
1

-scrollToVisibleRect:animated:or -setContentOffset:animated:inのいずれか-searchBarTextDidBeginEditingで、誤ったスクロールの大部分を停止します。

于 2012-05-24T04:13:23.907 に答える