【问题标题】:Draw a 1-pixel wide box around a zoomable UIIMageView that is inside a UIScrollView在 UIScrollView 内的可缩放 UIIMageView 周围绘制一个 1 像素宽的框
【发布时间】:2018-01-15 09:51:11
【问题描述】:

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

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return _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 添加到滚动视图并在处理程序中调用updateLayer,但比方法 #2 和 #3 慢得多。

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

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

【问题讨论】:

  • 您是否尝试过使用imageView.layer.borderWidth

标签: ios objective-c iphone uiscrollview uiimageview


【解决方案1】:

设置imageViewborderWidth

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

如果因此边框也放大了,您只需将scrollViewWillBeginDragging 中的borderWith 设置为0.0,然后将scrollViewDidEndZooming 中的scrollViewDidEndZooming 设置回1.0

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 1970-01-01
    • 2013-03-12
    • 2012-02-12
    • 2012-11-24
    • 1970-01-01
    • 2012-08-16
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多