【发布时间】:2018-01-15 09:51:11
【问题描述】:
我在 UIScrollView 中有一个 UIImageView。图片应该是可缩放的,所以我在滚动视图的viewForZoomingInScrollView 方法中返回它:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return _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 添加到滚动视图并在处理程序中调用updateLayer,但比方法 #2 和 #3 慢得多。
我得到的最好结果来自 #2 和 #3。但是,滚动视图缩放的刷新率高于我的 CADisplayLink。
知道如何以更高的速率拨打updateLayers 或达到我想要的结果吗?
谢谢。
图片说明:左侧:原始图片尺寸。右侧:放大但盒子厚度相同。
【问题讨论】:
-
您是否尝试过使用
imageView.layer.borderWidth?
标签: ios objective-c iphone uiscrollview uiimageview