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时重绘子视图