3

UIScrollViewコントローラーをiPhone4およびiOS5.1と組み合わせて使用​​すると、奇妙な問題が発生します。

コンテンツサイズが640x480(実質的にダブルスクリーン)のUIScrollViewがあり、2つの「画面」を切り替えるためのスワイプに加えて、ユーザーが画面をタップできるようにします。

[scrollView scrollRectToVisible:(CGRectMake 320,0,320,480) animated:YES];

スクロールビューの右側が表示されているときにタップが発生した場合、最初の320は0になります(スクロールビューではページングが有効になっているため、完全に左または完全に右にのみ停止できます)。

また、スクロールビューを含むこのビューコントローラー上でpresentModalViewControllerを使用して、追加のビューコントローラーをモーダルに表示する場合もあります。

モーダルビューコントローラが表示され、その後閉じられるまで、すべてが完全に機能します。その後、animatedがYESに設定されている場合、scrollRectToVisibleメソッドは機能しなくなります(animatedをNOに変更すると、期待どおりに機能します)。タップはまだ登録されており、scrollRectToVisibleが呼び出されていることに注意してください。アニメーションがYESに設定されている場合は、何も実行されません。

これがキッカーです。このバグは、iOS5.xを実行しているiPhone4でのみ発生します。
私の場合は(モーダルビューコントローラーが表示された後でも)完全に機能します:4.xを実行しているiPhone 3G、3.xを実行しているiPhone 3GS、4.xを実行しているiPod touch(第2世代)、そして最も驚くべきことに、5.xを実行しているシミュレーター。

これはアニメーションシステムのバグであるかどうか疑問に思ったので、モーダルビューコントローラのプレゼンテーションでアニメーションを無効にして却下しましたが、これは効果がありませんでした。iOS5.1を搭載したiPhone4でも問題が発生しました。

何がこれを引き起こしているのか、そして私がそれをどのように回避するのかについて誰かが何か考えを持っていますか?

4

3 に答える 3

2

最後にこれを追跡しました。なんて豚…

ビューコントローラからのビューを、別のビューコントローラビューのサブビューとして埋め込みます。したがって、私のスクロールビューには、ビューコントローラーが関連付けられているビューが含まれています。

iOS 5.xより前では、メソッドviewWillAppear、viewWillDisappear、viewDidAppear、およびviewWillDisappearは、サブビュービューコントローラーでは呼び出されず、メインビューコントローラーでのみ呼び出されます。これをすでに知っているので、これらのイベントが発生したときにサブビュービューコントローラーメソッドを手動で呼び出すようにメインビューコントローラーを設定しました。

ただし、iOS 5.xではこの問題が「修正」されているため、viewWillAppearの呼び出しをサブビューコントローラーに手動で渡す場合、メソッドは5で自動的に呼び出されるため、5.xでこれを行う必要はありません。 x-その結果、5.xでは2回呼び出されますが、4.x以前のデバイスで実行している場合は1回だけ呼び出されます。

その結果、5.xでは、updateUIメソッドを呼び出すために使用されるNSTimerが2回作成されますが、viewDidDisappearでは、タイマーがnil以外の場合にのみ破棄されるため、1回だけ破棄されます。したがって、5未満のNSTimerがリークしています。私が4.x未満ではない場合の二重割り当てによるx。

複数のNSTimerが繰り返し私のupdateUIメソッドを呼び出している結果、UIの継続的な更新によってアニメーションシステムが強制終了され、実際のデバイスで実行すると、scrollViewのアニメーションが失敗します。MacのCPUは余分なワークロードを処理し、アニメーションを正しく実行できる以上の能力があるため、5.xを実行しているシミュレーターでも問題なく動作し続けたと思います。

私のviewWillAppearメソッドをチェックして、NSTimerがまだ作成されていないことを確認すると、問題が修正され、4.x以前との互換性が維持されます。

AppleがiOSをメジャーバージョンでアップデートするたびに、私はイライラしてこの種の問題に直面します...この話の士気は、長年のクラスがOSの異なるリビジョンでも同じ動作を示すとは想定していません。

于 2012-05-10T19:27:29.547 に答える
0

私はついにこれを5.1を実行しているiPhone4で動作させることができました。スクロールビューのバウンス水平プロパティが設定されていることを確認すると、問題が修正されましたが、これをオフにすると、そもそも問題が発生する理由は私にはわかりません。これはiOSのバグであると確信しています。

于 2012-05-09T14:07:06.750 に答える
0

私も同じ問題を抱えていました。modalViewController却下された後、ステータスバーと同じ高さである20pxUIScrollerViewだけシフトダウンすることに気づきました。つまり、myがロードされて作成されたとき、実際にはステータスバーがあるのに、ステータスバーはないと考えているということです。だから私はviewDidLoad を入れようとしました:UIViewControllerUIScrollViewUIScrollView

[[UIApplication sharedApplication] setStatusBarHidden:NO];

これUIScrollViewで、Y位置が20pxのステータスバーの下に常に留まります。シフトダウンすることはありません。

于 2013-02-14T11:50:52.693 に答える