iPhoneアプリのUIScrollViewに小さな画像を描画しようとしています。バンドルに含めたpngから作成されたUIImageから始めましたが、問題なく動作します。ズーム/パンが停止するたびに、スクロールビューのデリゲートはそのUIImage(UIScrollViewのcontentViewのサブビュー)のフレームを再計算し、setNeedsDisplayを呼び出します。画面上で画像を同じサイズに保ちたいので、スクロールビューにズームインすると、フレームの幅/高さの測定値がどんどん小さくなります。ユーザーがズームしている間、画像は間違ったサイズですが、ズームが停止するとすぐに修正されます。素晴らしいことではありませんが、最悪のことでもありません。
問題は、静的なpngではなく、自分で画像を描画したいということです。UIViewをサブクラス化して、drawRectメソッドを使用しましたが、ビューを拡大したときに滑らかなパスを描画するための計算を正しく行うことができません。線の幅と円の半径を縮小するだけでよいと思いました。描画中(CGContextAddArc)ですが、iPhoneがビューを拡大してその上に非常に正確な円を描画するのではなく、2つまたは3つのピクセルに細い線の円を描画してからそれらのピクセルを拡大しようとしたように見えます。
これは、UIView(UIScrollViewのcontentViewのサブビュー)のサイズを変更するViewControllerです。
float scaler = (1/scrollView.zoomScale);
[targetView setFrame:CGRectMake(viewCoords.x-11*scaler, viewCoords.y-11*scaler, 22*scaler,22*scaler)];
[targetView setNeedsDisplay];
これはUIViewのdrawRectです
float x = rect.origin.x + rect.size.width/2.0;
float y = rect.origin.y + rect.size.height/2.0;
float radius = (rect.size.width-2.0*lineWidth)/2.0;
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ctx,lineWidth );
CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);
CGContextAddArc(ctx, x, y, radius , 0, 2* M_PI, 1);
CGContextClosePath(ctx);
CGContextStrokePath(ctx);
UIViewサブクラスを別の場所に配置するというアイデアは受け入れていますが、UIScrollViewのコンテンツビューと同期して移動する必要があります。