2016-12-15 6 views
1

Я пытаюсь нарисовать строку на UIView с UIBezierpath. Я думаю, что чего-то не хватает, но не смог найти его.Рисование строки в Swift 3.x с UIBezierPath

Вот мой код:

// Code for touch recognition 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    swiped = false 
    if let touch = touches.first as? UITouch? { 
     lastPoint = (touch?.location(in: fullview))! 
     //print(lastPoint) 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    swiped = true 
    if let touch = touches.first as? UITouch? { 
     let currentPoint = touch?.location(in: fullview) 
     drawLineFrom(fromPoint: lastPoint, toPoint: currentPoint!) 

     lastPoint = currentPoint! 
     //print(lastPoint) 
     //print("touch moved") 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if !swiped { 
     drawLineFrom(fromPoint: lastPoint, toPoint: lastPoint) 
    } 
    //print("touch ended") 
} 

//code for drawing 
func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint){ 

    UIGraphicsBeginImageContext(fullview.frame.size) 

    let context = UIGraphicsGetCurrentContext() 

    let aPath = UIBezierPath() 

    //aPath.move(to: fromPoint) 
    //aPath.addLine(to: toPoint) 
    aPath.lineWidth=10.0 
    aPath.lineJoinStyle = .round 
    aPath.move(to: CGPoint(x:15,y:15)) 
    aPath.addLine(to: CGPoint(x:80,y:80)) 
    aPath.addClip() 
    aPath.close() 
    UIColor.green.set() 
    aPath.stroke() 

    //print("drawline") 
    //print("Frompoint = ",fromPoint) 
    //print("topoint = ",toPoint) 

    /* context?.setLineCap(.round) 
    context?.setLineWidth(brushWidth) 
    context?.setStrokeColor(red: red, green: green, blue: blue, alpha: 1.0) 
    context?.setBlendMode(.normal) 

    context?.beginPath() 
    context?.move(to: fromPoint) 
    context?.addLine(to: toPoint) 
    context?.closePath() 
    context?.strokePath()*/ 


    //let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    fullview.setNeedsDisplay() 
} 

Как вы можете видеть, я пробовал также с контекстом, но он не работает слишком.

Благодарим за помощь!

+0

[Проверить это] (https://www.google.de/search?q=Drawing+a+line+in+Swift+3.x+with+UIBezierPath&ie=utf-8&oe=utf-8&client=firefox- b-ab & gfe_rd = cr & ei = 4K5SWNHCAq2o8weUg52YDg) – shallowThought

+0

Google - мой друг :) Я просто искал неправильные ключевые слова, thx –

+0

Это на самом деле ваше точное название :-) – shallowThought

ответ

7

Я использую это, чтобы нарисовать линию:

let doYourPath = UIBezierPath(rect: CGRect(x: xPos, y: yPos, width: yourWidth, height: yourHeight)) 
    let layer = CAShapeLayer() 
    layer.path = doYourPath.cgPath 
    layer.strokeColor = UIColor.white.cgColor 
    layer.fillColor = UIColor.white.cgColor 

    self.view.layer.addSublayer(layer) 

Надеется, что это поможет вам. Это всего лишь один способ быстро провести линию.

+0

Это мне очень помогло, спасибо –

+0

Добро пожаловать! –

2

Ну, вы рисуете контекст изображения (растровое изображение вне экрана), а не в виде. Это, скорее всего, не то, что вы хотите? Убедитесь, что вы прочитали iOS Drawing Concepts.

Ваш подкласс UIView должен, вероятно, просто отслеживать положения касаний (например, var touchedPositions = [CGPoint]()) и звонить по телефону setNeedsDisplay(). Затем примените метод func draw(_ rect: CGRect) в вашем подклассе. В рамках этого метода создайте свой путь и нарисуйте его в соответствии с позициями, которые вы отслеживаете (без создания нового контекста).

+0

Хорошо, понял, thx –