通过拖动边缘来转换视图(Swift)

时间:2017-02-16 14:18:32

标签: swift drawing

我尝试创建一个应用程序,用户可以在其中绘制或添加箭头,并转换此箭头(平移,旋转,...)。 目前,我设法绘制箭头并对其进行所有转换,但我现在要做的是能够通过拖动箭头来修改箭头。

要绘制箭头,我只需创建一个高度为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的图层。

我希望这些解释足够清楚:)。

你能帮我找一个解决方案吗?

谢谢!

1 个答案:

答案 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
    }
}