UIscrollView 上的绘图视图需要无限缩放

Posted

技术标签:

【中文标题】UIscrollView 上的绘图视图需要无限缩放【英文标题】:Need Infinite zooming for my Drawing View which is on UIscrollView 【发布时间】:2014-07-11 08:54:18 【问题描述】:

可以无限放大吗?因为我有地板绘图功能,所以我需要通过实现无限缩放来缩放一个小房间以显示更大。如果我将原始绘图视图缩放超过 15 倍,绘图就会消失并且什么也不显示。

任何建议将不胜感激!

这是我的示例代码块:

self.scrView.maximumZoomScale=200;
self.scrView.minimumZoomScale=0.5;

#pragma mark ScrollView Deleagte

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

    return self.objDrawingView;

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale

[self.objDrawingView.layer setContentsScale:self.objDrawingView.transform.a*[[UIScreen mainScreen] scale]];
    [self.objDrawingView setNeedsDisplay];

【问题讨论】:

【参考方案1】:

如果您自己在drawRect 中进行绘图,听起来更好的性能(当然是因为您的“忽略虚假层”消息),拥有一些包含比例和偏移的自己的值,并尊重这一点在您的绘图代码中。这样,图层的大小将始终保持不变,如果大部分图层超出显示范围,则无需绘制那么大的图层。

当然它不应该是 scrollView 的孩子,所以你还需要从 scrollViewDidScroll 获取值来计算你当前可见的矩形。

想法的例子: 如果drawRect 中的当前代码看起来像

CGContextFillRect( CGRectMake(x,y,width,height) );

并且您通过缩放整个层来缩放它,我建议有一个包含当前比例的变量并且不要缩放整个层,例如:

CGContextFillRect( CGRectMake(x* _zoomScale,y* _zoomScale,width* _zoomScale,height* _zoomScale) );

或者更好地使用CGContext 上的缩放和翻译方法,那么您的绘图代码将独立于这些。 drawRect 的前三行应该是:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, -_contentOffset.x, -_contentOffset.y);
CGContextScaleCTM(context, _zoomScale, _zoomScale);

将 zoomScale 和 contentOffset 设为属性并在 UIScrollViewDelegate 方法中设置。

【讨论】:

能否请您添加一些您真正想说的代码?【参考方案2】:

不确定阅读transform.a 是否是正确的方法。改用方法中的scale 变量可能更好。

【讨论】:

是的,即使sacle值也一样。但问题是在放大到原始大小的 8-10 倍后,它没有调用 drawRect 方法。 也给出了类似的错误:“ignoring bogus layer...”

以上是关于UIscrollView 上的绘图视图需要无限缩放的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何在捏缩放uiscrollview时重绘子视图

使用 Quartz 2d / CGContext 绘图和缩放的问题

缩放时,UIScrollview 子视图无法识别手势

UIScrollView 内的绘图视图

正确缩放包含许多子视图的 UIScrollView

当我无法使用 UIScrollView 时,如何在自定义 UIView 中模拟惯性滚动?