拖动并缩放使用 UIBezierPath IOS/Swift 绘制的矩形

Posted

技术标签:

【中文标题】拖动并缩放使用 UIBezierPath IOS/Swift 绘制的矩形【英文标题】:Drag and sacale a rectangle drawn using UIBezierPath IOS/Swift 【发布时间】:2016-03-09 11:16:37 【问题描述】:

我正在开发一个程序,它可以识别图像中的一个矩形,并在该识别的矩形的边界上绘制一条路径。现在我想重新定位该路径,以防它不在确切位置。例如看这张图片

在这种情况下,我需要拖动路径的角并将其重新定位为适合矩形。

为了绘制路径,我使用了 CAShapeLayer 和 UIBezierPath。这是我用来绘制路径的代码。

// imgView is the UIImageView which contains the image with the rectangle

let line: CAShapeLayer = CAShapeLayer();
line.frame = imgView.bounds; 
let linePath: UIBezierPath = UIBezierPath();

linePath.moveToPoint(CGPointMake(x1, y1);
linePath.addLineToPoint(CGPointMake(x2, y2);
linePath.addLineToPoint(CGPointMake(x3, y3);
linePath.addLineToPoint(CGPointMake(x4, y4);
linePath.addLineToPoint(CGPointMake(x1, y1);
linePath.closePath();

line.lineWidth = 5.0;
line.path = linePath.CGPath;
line.fillColor = UIColor.clearColor().CGColor;
line.strokeColor = UIColor.blueColor().CGColor;

imgView.layer.addSublayer(line);

问题是我试图向 UIBezierPath 添加一个手势。但我注意到没有这样的事情。找不到任何关于此的内容。所以有人可以让我知道一种方法来完成我的工作。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您是对的,没有办法将手势识别器附加到UIBezierPath。手势识别器附加到UIView 对象,UIBezierPath 不是视图对象。

没有内置机制可以做到这一点。你需要自己做。我建议建立一个类家族来处理它。创建一个矩形视图类。它将在内部使用贝塞尔路径,并在顶点上放置 4 个角点视图,并为每个角点视图安装平移手势识别器。

请注意,Cocoa 矩形 (CGRects) 不能旋转。您需要使用一系列相连的线段并编写逻辑使其保持方形。

【讨论】:

感谢邓肯的建议。我会试试看。顺便说一句,再次感谢您的快速回复,很抱歉迟到回复您的回答。欢呼

以上是关于拖动并缩放使用 UIBezierPath IOS/Swift 绘制的矩形的主要内容,如果未能解决你的问题,请参考以下文章

转iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) -- 不错不错

CAShapeLayer的缩放动画问题[重复]

UIBezierPath 路径形状可点击和可拖动

IOS拖放与缩放

计算 UIBezierPath 曲线控制点

SwiftUI Map iOS 14 手柄拖动和放大手势