Как преобразовать линию во время события жеста панорамирования?
Я создаю блок-схему, и когда пользователь перетаскивает узел, я хочу переместить линию, связанную с ним. В обработчике панорамирования события узла я реализовал 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
}
результат: