2017-02-16 2 views
0

Я пытаюсь создать приложение, в котором пользователь может нарисовать или добавить стрелку, и преобразовать эту стрелку (перевести, повернуть, ...). На данный момент мне удается нарисовать стрелку и сделать все преобразования на ней, но теперь я хотел бы изменить стрелку, перетаскивая ее края.Преобразование вида путем перетаскивания его края (Swift)

Чтобы нарисовать стрелу, я просто создаю UIView с высотой 20 пикселей (это толщина стрелки) и шириной 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

Не могли бы вы опубликовать ваш код для стрелок? Трудно помочь, не видя этого. – dfd

+0

Спасибо за ваш ответ. Я добавил, как я создаю стрелку (которая является слоем в UIView, который я преобразовываю :) – Adz

+0

Вот что я искал. Я отправлю ответ, и если это не то, что работает для вас, сообщите мне, и я удалю его. – dfd

ответ

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 
    } 
} 
Смежные вопросы