エグゼクティブ サマリー:UIScrollViewの値に望ましくない変更を加えることがあり
、contentOffsetその結果、アプリが表示中のドキュメント内の間違った場所を表示する原因となります。不要な変更は、スクロール ビューのアニメーション化された変更に関連して発生しますzoomScale。
詳細:
でズームアウトするときに問題が発生しCATiledLayerましたUIScrollView。はCATiledLayerpdfを保持しcontentOffset、特定の範囲内にある場合、ズームアウトするとcontentOffset、ズームが発生する前に変更されます(これがバグです)。AppleのcontentOffsetコードで変更されたようです。
問題を説明するために、Apple のサンプル アプリ ZoomingPDFViewer を変更しました。コードは github にあります: https://github.com/DirkMaas/ZoomingPDFViewer-bug
タップするとzoomScale、 を使用して 0.5 に変更されanimateWithDuration、ズームアウトします。UIScrollViewがcontentOffset.y約 2700 未満または 5900 を超える場合、アニメーションzoomScaleは正常に機能します。contentOffset.yがこれらの 2 つの値の間にあるときにタップが発生するとcontentOffset.y、 は約 2700 にジャンプし (アニメーション化されません)、その後zoomScaleアニメーションが発生しますが、同時にスクロールが発生するため、アニメーションが完了すると、contentOffset.yがその場所になります。する必要があります。しかし、ジャンプはどこから来るのでしょうか?
たとえばcontentOffset.y、画面がタップされたときの値が 2000だとしますzoomScale。アニメーションは問題なく動作します。contentOffset.y変更されません。
しかしcontentOffset.y、画面をタップしたときに が 4000 の場合: はcontentOffset.yアニメーションなしで約 2700 にジャンプし、その時点からズームとスクロールが開始され、同時に発生します。アニメーションが完了すると、4000 からまっすぐにズームしたように見えるため、最終的に正しい場所に移動しますが、動作は間違っています。
UI に関する注意事項:
- テキストは通常の方法で垂直方向にスクロールできます
- テキストは通常の方法でピンチすることでズームインおよびズームアウトできます
- 1 回タップすると が
zoomScale0.5 に設定されます。変更はアニメーション化されます
zoomScaleが 0.5 より大きい場合、ジャンプはそれほど大きくないことに気付きました。また、のsetZoomScale:animated:代わりに使用するanimateWithDurationとバグはなくなりますが、アニメーションを連鎖させる必要があるため使用できません。
これが私がしたことの要約です(githubのコードにはこれらの変更が含まれています):
- http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.htmlから ZoomingPDFViewer をダウンロード し、XCode で開きました。
- ビルド設定の変更 | アーキテクチャ | ベース SDK を最新の iOS (iOS 4.3) に変更すると、ビルド設定が変更されました | GCC 4.2 - 言語 | ソースを Objective-C++ としてコンパイルする
- プロジェクトから TestPage.pdf を削除しました
- プロジェクトの代わりに「whoiam 5 24 cropped 3-2.pdf」を追加
- クラス
PDFScrollView *scrollView;に追加ZoomingPDFViewerViewController - 代わりに初期化するように変更さ
loadViewれましたZoomingPDFViewerViewControllerscrollViewsv viewDidLoad、handleTapFrom:recognizerおよびPDFScrollview.mzoomOutに追加ZoomingPDFViewerViewController- コメントアウトされて
scrollViewDidEndZooming:withView:atScaleおりscrollViewWillBeginZooming:withView:、画像の背景で目前の問題から気をそらすようなことをしているためです
私と一緒にいてくれてありがとう、そしてすべての助けを!