2

カスタムUIViewを含むUIScrollViewがあります。UIViewで、drawRectをオーバーライドして、CGContextStrokePathを使用してパスを描画しています。ズームの動作を少し変更したいと思います。ピンチズームアウトすると、画面にさらに多くのパスが表示されます。これは私が望んでいることですが、ユーザーがはっきりとわかるように、ズームアウトしても線幅が縮小しないようにしたいのです。

私はこれをやろうと思っていました(myUIViewズームターゲットは_lineViewと呼ばれます)

-(void)scrollViewDidZoom:(UIScrollView *)pScrollView
    {
      _lineView.zoomScale = _scrollView.zoomScale;
      [_lineView setNeedsDisplay];
    }

次に、_lineView drawRectメソッドで適切な線のストロークサイズを計算するだけで、ズームアウトしたときに一定の線幅の効果が得られます。

これは非常に遅く、drawrectが1秒間に何度も呼び出されるように最適化されていないため、これが予想されることを読みました。

次に、代わりにGLKViewを使用して、すべてをopenglで直接レンダリングすることを検討し始めました。これに伴う問題は、すべてのズームとパンを自分で実装する必要があることです(UiScrollViewで無料で入手できるすべての素敵なズームとパンバウンス効果を使用)。また、opengl、ボタンなどで使用したいすべてのコントロールを実装する必要があります。

Quartz2dを使用しながらこれを行う方法はありますか?openglは私に多くの力を与えるように感じますが、そのルートをたどると、アプリの残りの部分を完了するのにはるかに長い時間がかかります。

4

2 に答える 2

3

私はこれを理解しました。ズーム/バウンスアニメーションの速度をまったく低下させず、非常に高速で流動的な、これを行う簡単な方法を見つけました。

QuartzにはCAShapeLayerと呼ばれるクラスがあり、かなりクールなことを実行できます。これらの中には、CGPathプロパティを設定し、線幅を指定できることがあります。変更はビューに反映されます。

したがって、基本的に、scrollViewDidZoomメソッドからshapeLayer.lineWidthを呼び出します。これにより、必要な処理が正確に実行されます。

于 2012-06-22T10:11:08.177 に答える
1

私があなただったら、ズーム中にデフォルトのズーム動作を使用することです(これは再描画されませんが、代わりにズームされたビューに変換を適用します。これは、GPUによって非常に迅速に実行できますが、お気づきのとおりです。品質の低下につながる可能性があります)。

次に、ユーザーがズームを終了したら、今と同じようにビュー全体を再描画します。適切なデリゲートメソッドはscrollViewDidEndZooming:withView:atScale:です。

このようにして、ズームが高速(ただし少し醜い)になり、ズームが終了した後の表示がきれいになります(ただし、わずかに、おそらく目立たないほど遅くなります)。

于 2012-06-20T09:40:06.837 に答える