在缩放 UIScrollView 子视图时保持恒定的线宽

Posted

技术标签:

【中文标题】在缩放 UIScrollView 子视图时保持恒定的线宽【英文标题】:Maintain constant line width in zooming UIScrollView subView 【发布时间】:2011-05-30 10:32:17 【问题描述】:

我有一个缩放UIScrollView,其中包含一个UIView,其中包含一些自定义UIViews,属于MyRectangleViewScrollView 和这些 rectangleViews 都获得一个指向通用自定义 UIViewControllerMyViewController 的指针。

是否可以渲染这些自定义视图,使它们在 scrollView 缩放时显示为 grow,而不是显示为 scaled

我确实覆盖了drawRect:,并且通过在myViewController 中实现scrollViewDidZoom: 并将当前zoomScale 存储在一个属性中,我设法使它们改变了它们的高度,但在缩放滚动视图时保持它们的宽度可从rectangleViews 访问,然后将它们的宽度除以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 子视图时保持恒定的线宽的主要内容,如果未能解决你的问题,请参考以下文章

当轴垂直时在 UIStackView 的子视图上设置恒定宽度

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

UIScrollview 子视图在缩放后无法识别平移手势

关闭 UIScrollView 的滚动,但保持缩放功能

内部动画时的 UIScrollView 回调

UIScrollview 在缩放时同步子视图原点