我尝试创建一个应用程序,用户可以在其中绘制或添加箭头,并转换此箭头(平移,旋转,...)。 目前,我设法绘制箭头并对其进行所有转换,但我现在要做的是能够通过拖动箭头来修改箭头。
要绘制箭头,我只需创建一个高度为20像素(箭头粗细)的UIView,宽度为400(箭头的长度)。
func drawArrow(frame: CGRect) {
let thicknessArrow = 20
let viewHorizontalArrow = UIView()
viewHorizontalArrow.frame.origin = CGPoint(x: 100, y: 600)
viewHorizontalArrow.frame.size = CGSize(width: 400, height: thicknessArrow)
drawDoubleArrow(viewHorizontalArrow, startPoint: CGPoint(x: 0, y: thicknessViewWithArrow/2), endPoint: CGPoint(x: viewHorizontalArrow.frame.width, y: thicknessViewWithArrow/2), lineWidth: 10, color: UIColor.blackColor())
}
之后,由于平移,捏合和旋转手势,我改变了UIView。
函数“drawDoubleArrow”使用BezierPath创建一个箭头并将其添加到UIView的图层。
我希望这些解释足够清楚:)。
你能帮我找一个解决方案吗?
谢谢!
答案 0 :(得分:0)
UIBezierPath
不能轻易被手势操纵,因为它无法识别它们。但是UIView
可以识别手势。结合CALayer
的转换能力和hitTest()
方法,我认为你可以达到你想要的效果。
// I'm declaring the layer as a shape layer, but depending on how your error thick is, you may need a rectangular one
let panGesture = UIPanGestureRecognizer()
var myLayer = CAShapeLayer()
<强> viewDidLoad中:强>
// I'm assuming you've created myBezierPath, an arrow path
myLayer.path = myBezierPath.cgPath
// Adding the pan gesture to the view's controller
panGesture.addTarget(self, action: #selector(moveLayer))
self.addGestureRecognizer(panGesture)
<强> moveLayer:强>
func moveLayer(_ recognizer:UIPanGestureRecognizer) {
let p = recognizer.location(in: self)
// You will want to loop through all the layers you wish to transform
if myLayer.hitTest(p) != nil {
myLayer.position = p
}
}