2009-09-01 15 views
8

を追加/削除した後は動作しません:NOに戻って「非表示」に設定するとiPhone OS:バーが一番上までスクロールするにはタップ状態は、ステータスバー非表示にするには、このメソッドを使用してバック

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 

を、TAP- to-scroll-to-top(UIWebView、UITableViewなど)ではこれ以上動作しません。機能を元に戻すには、アプリケーションを再起動する必要があります。

これはバグですか(私は何とかrdarを提出しました)、またはステップを逃しましたか? statusBarがそれぞれのビューで何らかの形で「触れていない」ため、おそらくこの動作を期待する必要がありますか?

答えて

18

あなたはそれを再表示した後、再びtrueにScrollsToTopプロパティを設定してみてください:

[currentView setScrollsToTop:YES]; 

それは、あなたは間違いなく1つのビューのみを示している動作していないですか?複数のスクロールビューがある場合、scrollViewDidScrollToTopメッセージは無視されます...

+0

非常に良好な観察。おそらく、複数のビューと混同している可能性があります。回避策が見つかるかどうか確認してください。 – avocade

+0

問題は、スクロール・ツー・トップ・ビヘイビアを取得する必要があるUIWebViewであり、直接UIScrollViewサブクラスではないということです。したがって、setScrollsToTop:はまったく動作しません。 ITはおそらくUIWebViewInternal構造体のどこかにscrollViewを持っていますが、それは_very_ opaqueと思われます。 [webView valueForKey:@ "_ scrollView"]は、それを直接保持するために全く機能しませんでした。他の名前は推測できますか? :) – avocade

+0

あなたはUIScrollViewのサブビューとしてUIWebViewを追加することができます(私の実装では、UITableViewのサブビューです)。そのUIScrollView内の唯一のビューであれば、UIScrollView上で-setScrollsToTopを呼び出すと、UIWebView上で動作するようにする必要があります。 – h4xxr

0

私は現在作業中のアプリケーションで同様の動作をしました。その場合、UIWebViewからYouTubeビデオを読み込むと、アプリケーションのライフサイクルの残りの部分でスクロールしてトップに戻ります。私は映画プレーヤーを読み込んだ後にこれが起こるかもしれないと考えていますが、確認はしていません。その機能性はずっと長くなり、おそらくバグは少なくなりました。

5

あなたは余分なUIScrollViewなしUIWebViewscrollToTopを無視持つように次のコードを使用することができます。

((UIScrollView *)[[webView valueForKey:@"_internal"] valueForKey:@"scroller"]).scrollsToTop = NO; 
+4

プライベートAPI呼び出しを使用するため、アプリケーションが拒否される可能性があります。あなたは '((UIScrollView *)[[webView subviews] objectAtIndex:0])を取り除くことができるかもしれません。scrollsToTop = NO;' –

+0

ありがとうアレックス!はるかにエレガントで安全です。 –

+0

これは私のために働く。素晴らしいソリューション、ありがとう! – Jasarien

3

私は私のアプリ内でYouTubeの動画を再生した後、同様の問題がありました。 scrollsToTopはまだYESに設定されていましたが、ステータスバーをタップしても効果はありませんでした。

最後に、自分のアプリウィンドウがキーウィンドウではなくなったことに気付きました。 (私はすでに他の理由のために持っていた)UIWindowサブクラスに次の行を追加した後、すべてが再びそれが必要として働いていた:

if (![self isKeyWindow]) [self makeKeyWindow]; 
5

を私はスクロール・ツー・トップ機能が失われた同様の問題を抱えていました。これは、(同じスクロールビュー内で)一度にアクティブなビューが1つしかない場合にのみ有効です。私の場合は、テーブルビューとフェードイン/アウトのビューがありました。アニメーションの終わりにremoveFromSuperviewを追加すると、そのトリックが行われました。

/* 
this is for the scroll to top gesture. by default, a single scroll visible scroll view with this flag set will get the call. if there is more than one visible with this 
flag set or the delegeat method returns NO, the view isn't scrolled 
*/ 
@property(nonatomic) BOOL scrollsToTop;   // default is YES. if set, special gesture will scroll to top of view after consulting delegate 
7

アレックスすることにより、以下の修正が私の仕事:

答えはUIScrollView.hファイルのコメントにありました。ありがとう!この修正プログラムは、急いで大きな作業中

((UIScrollView *)[[webView subviews] objectAtIndex:0]).scrollsToTop = NO; 

、しかしより多くの時間与えられた私はのUIWebViewをサブクラス化し、直接保護UIScrollViewのメンバーにアクセスしたことがあります。

私がAlexのメソッドで心配しているのは、UIScrollViewがサブビューのインデックス0にあることです(カプセル化によってプライベートメンバーが変更できることが前提です)。これは、まだ別の解決策を示唆しています。

for (UIView* v in [webView subviews]) 
{ 
    if ([v isKindOfClass:[UIScrollView class]]) 
    { 
     (UIScrollView *)v.scrollsToTop = NO; 
    } 
} 
10

iOS 5の場合。複数のscrollviewがある場合は0あなたがのUIWebView

webView.scrollView.scrollsToTop = YES; 
0

私はh4xxrが上に答えていたとして、私は、UIScrollViewの上のUIWebViewを追加し、私の場合を追加したい:

つ以上のスクロールビューscrollViewDidScrollToTopがある場合メッセージは無視されます

したがって、私はそれをWebViewで動作させる簡単な方法を得ます:scrollViewのscrollsToTopプロパティをfalseに設定します。

ステータスバーをタップすると、scrollViewでインターセプトされず、webViewがトップにスクロールします。

UIScrollView *scrollView = [[UIScrollView alloc] init]; 
    scrollView.frame = self.view.bounds; 
    scrollView.scrollsToTop = false; //igore scrollView`s scrollsToTop 
    [self.view addSubview:scrollView]; 

    UIWebView *webView = [[UIWebView alloc] init]; 
    webView.frame = scrollView.bounds; 
    [scrollView addSubview:webView]; 
関連する問題