在UIScrollView

时间:2017-08-08 01:27:59

标签: ios objective-c iphone uiscrollview uiimageview

我在UIScrollView中有一个UIImageView。图像应该是可缩放的,所以我在滚动视图的viewForZoomingInScrollView方法中返回它:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return _imageView; }

目标是在此图像周围绘制一个1像素宽的框。该框应调整大小以围绕UIIMageView,而不缩放其线条的粗细。可以将其视为PowerPoint或任何图像编辑程序中图像的指南/框。

我创建了一个名为CALayer的{​​{1}},其中包含在图片周围绘制的borderBoxLayer。 我尝试了以下4种方法:

1-将此图层添加到UIImageView不会起作用,因为它也会缩放框线(因为它们是UIImageView的一部分)。盒线应始终为1像素宽。

2-我使用CADisplayLink每帧REDRAW图层

UIBiezerPath

CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateLayers)]; [displayLink setPreferredFramesPerSecond:60]; [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 内,我得到imageView的当前帧,以便能够更改updateLayers的帧。这种方法部分工作"部分"。盒子的位置和大小按预期工作,但是有一个滞后,使它变得华丽"放大/缩小时。我还尝试删除图层并使用更新的框架重新添加图层,但结果相同。

3-我创建了一个假的UIView,它位于ScrollView的顶部,我使用相同的显示链接将borderBoxLayer添加到此borderBoxLayer。它减少了滞后,但它仍然存在。

4-还尝试在fakeView方法中调用updateLayers,例如UIScrollViewDelegatescrollViewWillBeginDragging等。并将我自己的scrollViewDidEndZooming添加到滚动视图并在处理程序中调用UIPinchGestureRecognizer,但比方法#2和#3慢得多。

我得到的最好成绩来自#2和#3。但是,滚动视图缩放的刷新率高于我的CADisplayLink。 知道如何以更高的速度拨打updateLayer或达到我想要的结果吗? 感谢。

图片标题:左侧:原始图片大小。在右边:放大但是盒子厚度是一样的。

on left: original image size. on right: zoomed in but box thickness is the same

1 个答案:

答案 0 :(得分:1)

设置borderWidth

imageView
imageView.layer.borderWidth = 1.0
imageView.layer.borderColor = //Whatever color

因此,如果边框也会放大,您可以在borderWith中将scrollViewWillBeginDragging设置为0.0并在scrollViewDidEndZooming中将其设置为1.0