gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:42:44 28 4
gpt4 key购买 nike

我在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com