2017-09-14 6 views
1

UIBezierPath를 사용하여 선을 그립니다. 스트레칭하고 싶지만 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 선의 시작점과 끝점을 어떻게 바꿀 수 있습니까?UIBezierPath를 사용하여 그린 선을 늘리는 방법은 무엇입니까?

let line = CAShapeLayer() 
let linePath = UIBezierPath() 

func DrawLine() 
{ 
    linePath.move(to: to: CGPoint(x: 100, y: 100) 
    linePath.addLine(to: CGPoint(x: self.view.frame.width - 100, y: 100)) 
    line.path = linePath.cgPath 
    line.strokeColor = UIColor.red.cgColor 
    line.lineWidth = 1 
    line.lineJoin = kCALineJoinRound 
    self.view.layer.addSublayer(line) 
} 
override func viewDidLoad() 
{   
    super.viewDidLoad() 
    DrawLine() 
} 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
{ 
    line.frame.origin.x -=10 
    line.frame.size.width += 10 
} 

답변

0

속성을 사용하여 변경하려는 점을 저장하고 필요할 때 경로를 다시 만들어보십시오.

class FileViewController: UIViewController { 
    let line = CAShapeLayer() 
    var point1 = CGPoint.zero 
    var point2 = CGPoint.zero 

    func DrawLine() { 
     point1 = CGPoint(x: 100, y: 100) 
     point2 = CGPoint(x: self.view.frame.width - 100, y: 100) 

     let linePath = UIBezierPath() 
     linePath.move(to: point1) 
     linePath.addLine(to: point2) 

     line.path = linePath.cgPath 
     line.strokeColor = UIColor.red.cgColor 
     line.lineWidth = 1 
     line.lineJoin = kCALineJoinRound 
     self.view.layer.addSublayer(line) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     DrawLine() 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     point1.x -= 10 
     point2.x += 10 

     let linePath = UIBezierPath() 
     linePath.move(to: point1) 
     linePath.addLine(to: point2) 

     line.path = linePath.cgPath 
    } 
} 
+0

보기를 터치하면 touchesBegan 메소드가 트리거됩니다. 포인트 1과 포인트 2는 10pt만큼 수정되고 경로는 새로운 포인트로 재생성됩니다. 그러면 CAShapeLayer의 경로가 업데이트됩니다. –

+0

속성 값을 변경하면 CALayers가 자동으로 업데이트됩니다. 이 경우 경로 속성이 변경됩니다. setNeedsDisplay는 필요하지 않으며 CALayer에 draw (rect :) 메소드가 없습니다. 그러나 레이어를 서브 클래스 화하면 draw (in :) 메서드를 재정의 할 수 있습니다. –