【问题标题】:DrawRect of UIView inside UIScrollViewUIScrollView 内 UIView 的 DrawRect
【发布时间】:2011-01-04 02:14:25
【问题描述】:

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

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

这是调整 UIView 大小的 ViewController(它是 UIScrollView 的 contentView 的子视图)

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 同步移动

【问题讨论】:

    标签: iphone uiview uiscrollview drawrect


    【解决方案1】:

    请参阅 my answerthis question。 UIScrollView 在进行捏缩放时对您的内容视图应用转换,这就是导致您的模糊的原因。如果你按照我描述的方法,你可以重写它来清晰地绘制你自己的内容。

    【讨论】:

    • 谢谢布拉德。我对您的解决方案的解读是它调整了 UIScrollView 的内容视图的大小,这将严重改变我绘制它的方式,因为它是一个平铺层并且依赖于该层要求的坐标来确定要绘制哪些平铺。我希望避免修改我拥有的 tiledLayer,所以如果这是使用 drawRect 的唯一方法,我将不得不返回 PNG 方法。
    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多