我在 UIScrollView 中有一个 UIImageView。图像应该是可缩放的,所以我在 ScrollView 的 viewForZoomingInScrollView
方法中返回它:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
返回_imageView;
}
目标是围绕该图像绘制一个 1 像素宽的框。该框应调整大小以围绕 UIIMageView 而不缩放其线条的粗细。将其视为 PowerPoint 或任何图像编辑程序中图像周围的指南/框。
我创建了一个名为 borderBoxLayer
的 CALayer
,其中包含围绕图像绘制的 UIBiezerPath
。
我尝试了以下4种方法:
1- 将此层添加到 UIImageView 将不起作用,因为它也会缩放框线(因为它们是 UIImageView 的一部分)。框线应始终为 1 像素宽。
2- 我使用 CADisplayLink 在每一帧重绘图层
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateLayers)];
[displayLink setPreferredFramesPerSecond:60];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
在 updateLayers
中,我获取了 imageView 的当前帧,以便能够更改 borderBoxLayer
的帧。此方法“部分”有效。框的位置和大小按预期工作,但在放大/缩小时存在延迟,使其“浮华”。我也尝试删除图层并使用更新的框架重新添加它,但结果相同。
3- 我创建了一个位于 ScrollView 顶部的假 UIView,并使用相同的显示链接将 borderBoxLayer
添加到此 fakeView
。它减少了延迟,但它仍然存在。
4- 还尝试在 UIScrollViewDelegate
方法中调用 updateLayers
,例如 scrollViewWillBeginDragging
、scrollViewDidEndZooming
等。还将我自己的 UIPinchGestureRecognizer
添加到 ScrollView 并在处理程序中调用 updateLayer
但比方法 #2 和 #3 慢得多。
我得到的最好结果来自#2 和#3。但是, ScrollView 缩放的刷新率高于我的 CADisplayLink。
知道如何以更高的速率调用 updateLayers
或实现我想要的结果吗?
谢谢。
图像说明:左侧:原始图像尺寸。右侧:放大但盒子厚度相同。
最佳答案
设置imageView
的borderWidth
imageView.layer.borderWidth = 1.0
imageView.layer.borderColor = //Whatever color
如果结果边框也放大,您可以在 scrollViewWillBeginDragging
中将 borderWith
设置为 0.0,然后在 中将其设置回 1.0 scrollViewDidEndZooming
关于ios - 在 UIScrollView 内的可缩放 UIIMageView 周围绘制一个 1 像素宽的框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45557934/