UIVcrollView中的UIView的DrawRect

时间:2010-01-12 08:32:32

标签: iphone uiview uiscrollview drawrect

我正在尝试在UIScrollView上为我的iPhone应用程序绘制一个小图像。我开始使用我的包中包含的png创建的UIImage,这样就可以了。每次缩放/平移停止时,scrollview的委托重新计算该UIImage的帧(这是UIScrollView的contentView的子视图)并调用setNeedsDisplay。当您放大滚动视图时,框架在宽度/高度测量中变得越来越小,因为我希望图像在屏幕上保持相同的大小。当用户缩放时,图像尺寸错误,但一旦缩放停止,它就会得到纠正。不是很好,但也不是最糟糕的事情。

现在的问题是我想自己绘制图像而不是静态png。我已经将UIView子类化并进入了drawRect方法,但是当放大视图时,我无法使数学正确绘制平滑的路径。我想我可以缩小线宽和圆的半径I正在绘制(CGContextAddArc),但看起来iPhone似乎试图在两个或三个像素上绘制一个薄的带衬圈,然后放大这些像素,而不是缩放视图并在其上绘制一个高度精确的圆圈。

这是调整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的contentview同步移动

1 个答案:

答案 0 :(得分:1)

请参阅my answerthis question。 UIScrollView在进行缩放缩放时会对内容视图应用变换,这会导致模糊。如果你按照我描述的方法,你可以覆盖它来大幅绘制你自己的内容。