ios - 在 UIScrollView 内的可缩放 UIIMageView 周围绘制一个 1 像素宽的框

标签 ios objective-c iphone uiscrollview uiimageview

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

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

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

我创建了一个名为 borderBoxLayerCALayer,其中包含围绕图像绘制的 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,例如 scrollViewWillBeginDraggingscrollViewDidEndZooming 等。还将我自己的 UIPinchGestureRecognizer 添加到 ScrollView 并在处理程序中调用 updateLayer 但比方法 #2 和 #3 慢得多。

我得到的最好结果来自#2 和#3。但是, ScrollView 缩放的刷新率高于我的 CADisplayLink。 知道如何以更高的速率调用 updateLayers 或实现我想要的结果吗? 谢谢。

图像说明:左侧:原始图像尺寸。右侧:放大但盒子厚度相同。

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

最佳答案

设置imageViewborderWidth

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/

相关文章:

Android 相当于 CoreText

ios - BLE writeValue 到外设

ios - 设置 iOS 导航背景颜色无法正常工作

objective-c - NSThread 数据损坏

iphone - 在 iPhone/iPad 上也可以在网络上提供视频的最佳方式是什么?

ios - uiimageview 刷新所有其他 ImageView

iphone - 如何与 HTTP_PROXY 服务器建立 NSStream 套接字连接(服务器也需要身份验证)?

ios - coredata 中一列所有值的总和

iphone - 如果我点击 iphone 按钮到 "minimize"应用程序时如何在后台模式下播放音频?

ios - 我可以在没有推送通知的情况下使用 Scial.framework 吗?