在缩放 UIScrollView 子视图时保持恒定的线宽
Posted
技术标签:
【中文标题】在缩放 UIScrollView 子视图时保持恒定的线宽【英文标题】:Maintain constant line width in zooming UIScrollView subView 【发布时间】:2011-05-30 10:32:17 【问题描述】:我有一个缩放UIScrollView
,其中包含一个UIView
,其中包含一些自定义UIViews
,属于MyRectangleView
。 ScrollView
和这些 rectangleView
s 都获得一个指向通用自定义 UIViewController
、MyViewController
的指针。
是否可以渲染这些自定义视图,使它们在 scrollView 缩放时显示为 grow,而不是显示为 scaled?
我确实覆盖了drawRect:
,并且通过在myViewController
中实现scrollViewDidZoom:
并将当前zoomScale
存储在一个属性中,我设法使它们改变了它们的高度,但在缩放滚动视图时保持它们的宽度可从rectangleView
s 访问,然后将它们的宽度除以zoomScale
。
我对线宽做了同样的处理,但是由于所有的缩放,结果看起来很模糊(尽管线宽在视觉上或多或少保持不变)。
有没有更好的方法来做到这一点?
如何实现自定义 UIView 作为缩放 UIScrollView 的子视图,提供恒定的线宽且不会变得模糊?
我想到的一个解决方案是使缩放视图不可见,并在 scrollView 之上创建其他视图以从中获取它们的大小,但如果可能的话,我宁愿避免这样做。
【问题讨论】:
【参考方案1】:我已经成功地使用了另一种方法。我在子类 UIView 中写了一个自定义方法
-(void)resize:(CGFloat)scale
self.transform = CGAffineTransformMakeScale(1/scale, 1/scale);
其中 scale 是 UIScrollView 当前的 zoomScale。该方法在父视图中从下面调用
-(void)scrollViewDidZoom:(UIScrollView *)_scrollView
for (PushPin *pushpin in drawingPlaceholder.subviews)
if ([pushpin isKindOfClass:[PushPin class]])
[pushpin resize:_scrollView.zoomScale];
【讨论】:
【参考方案2】:答案是将这些矩形视图设置为 UIScrollView 的子级,而不是让viewForZoomingInScrollView:
返回它们。这意味着它们将被滚动,但不会被缩放。
在他们的drawRect:中,我用scrollView的zoomScale(由VC提供)转换他们的框架。这会导致轻微的伪影,因为更改框架会触发重绘(不触发 drawRect:),但我愿意暂时忍受。
这意味着我可以像缩放它们一样设置它们的大小,但是用 1:1 像素绘制它们,添加文本、图像等,它们仍然清晰。
【讨论】:
以上是关于在缩放 UIScrollView 子视图时保持恒定的线宽的主要内容,如果未能解决你的问题,请参考以下文章