Как преобразовать линию во время события жеста панорамирования?

Я создаю блок-схему, и когда пользователь перетаскивает узел, я хочу переместить линию, связанную с ним. В обработчике панорамирования события узла я реализовал CGAffineTransform чтобы преобразовать линию, но она не перемещает линию плавно. Любая идея, как другие приложения блок-схемы решают эту проблему?

func panHandler(sender: UIPanGestureRecognizer) {

        else if (sender.state == .Changed)
        {
            let translation = sender.translationInView(self)
            sender.view!.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y)


           //rv is the connected line, created at an other place like:
           //let w = GraphViewController.calcLength(e.x, y0: e.y, x1: e2.x, y1: e2.y)
           //rv = UIView(frame: CGRectMake(0, 0, CGFloat(w), 1.0))
           //var angle = GraphViewController.calcAngle(e.x, y0: e.y, x1: e2.x, y1: e2.y)
           //rv.transform = CGAffineTransformMakeRotation(CGFloat(angle))

            var angle = GraphViewController.calcAngle(e!.x, y0: e!.y, x1: r.destination!.x, y1:r.destination!.y)
            rv!.transform = CGAffineTransformMakeRotation(CGFloat(angle))

        }
    }

1 ответ

Решение

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

Определите точку привязки для вашей линии

endOfLineAnchor = CGPoint(x: view.bounds.width / 2, y: view.bounds.height * 0.8)

Создайте некоторое представление, чтобы прикрепить его к

ballView = createBallView()
ballView.center = CGPoint(x: view.bounds.width / 2, y: view.bounds.height / 2)

Добавить слой и вид

    lineLayer = CAShapeLayer()
    lineLayer.strokeColor = UIColor.blackColor().CGColor
    lineLayer.path = pathFromBallToAnchor()
    view.layer.addSublayer(lineLayer)
    view.addSubview(ballView)

На панели обновите путь слоя

    else if (sender.state == .Changed)
    {
        let translation = sender.translationInView(self.view)
        sender.view!.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y)
        CATransaction.begin()
        CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
        lineLayer.path = pathFromBallToAnchor()
        CATransaction.commit()
    }

причина для CATransaction в том, что мы хотим отключить неявную анимацию.

Построить путь:

    func pathFromBallToAnchor() -> CGPathRef {
        var bazier = UIBezierPath()
        bazier.moveToPoint(ballView.center)
        bazier.addLineToPoint(endOfLineAnchor)
        return bazier.CGPath
    }

результат:

Шар закреплен на закрепленной линии в симуляторе iPhone 5 iOS 8.1

Другие вопросы по тегам