2014-10-30 16 views
20

ile bir çizgi çizme İlk kez BezierPaths kullanarak, bu işlevin gerçekten nasıl gerçekleştirileceğini düşünmek gerekiyor. Şu anda bezier yolu, ekranda çizim yapmak yerine görüntünün çerçevesi içinde hareket eder.UIBezierPath

Bunu yapmanın daha iyi bir yolu var mı?

func drawLineFromPoint(start : CGPoint, toPoint end:CGPoint, ofColor lineColor: UIColor, inView view:UIView) { 

    var maxWidth = abs(start.x - end.x) 
    var maxHeight = abs(start.y - end.y) 

    var contextSize : CGSize! 
    if maxWidth == 0 { 
     contextSize = CGSize(width: 1, height: maxHeight) 
    }else { 
     contextSize = CGSize(width: maxWidth, height: 1) 
    } 

    //design the path 
    UIGraphicsBeginImageContextWithOptions(contextSize, false, 0) 
    var path = UIBezierPath() 
    path.lineWidth = 1.0 
    lineColor.set() 

    //draw the path and make visible 
    path.moveToPoint(start) 
    path.addLineToPoint(end) 
    path.stroke() 

    //create image from path and add to subview 
    var image = UIGraphicsGetImageFromCurrentImageContext() 
    var imageView = UIImageView(image: image) 
    view.addSubview(imageView) 
    UIGraphicsEndImageContext() 
} 
+0

diğer, daha doğrudan yaklaşımlar, 'CAShapeLayer kullanmak edilir Burada açıklandığı gibi 'veya custom' drawRect': http://stackoverflow.com/a/16846770/1271826 – Rob

cevap

38

bu şekilde yapıyor bitti: William Falcon Kullanıcı Yanıtla

func drawLineFromPoint(start : CGPoint, toPoint end:CGPoint, ofColor lineColor: UIColor, inView view:UIView) { 

    //design the path 
    var path = UIBezierPath() 
    path.moveToPoint(start) 
    path.addLineToPoint(end) 

    //design path in layer 
    var shapeLayer = CAShapeLayer() 
    shapeLayer.path = path.CGPath 
    shapeLayer.strokeColor = lineColor.CGColor 
    shapeLayer.lineWidth = 1.0 

    view.layer.addSublayer(shapeLayer) 
} 
+1

Tasarım yolunu katman olarak kullanmadım. Ama sadece 'path.Stroke'. Neden hattın eklenmediğini anlamıyorum. Herhangi bir tavsiye? @williamFalcon –

2

Swift 3.1 Sürüm + Geliştirilmiş

Bu sadece güncellenmiş zaten kabul cevabın sürümü ve ben sadece biraz daha ekledi.

func drawLineFromPointToPoint(startX: Int, toEndingX endX: Int, startingY startY: Int, toEndingY endY: Int, ofColor lineColor: UIColor, widthOfLine lineWidth: CGFloat, inView view: UIView) { 

    let path = UIBezierPath() 
    path.move(to: CGPoint(x: startX, y: startY)) 
    path.addLine(to: CGPoint(x: endX, y: endY)) 

    let shapeLayer = CAShapeLayer() 
    shapeLayer.path = path.cgPath 
    shapeLayer.strokeColor = lineColor.cgColor 
    shapeLayer.lineWidth = lineWidth 

    view.layer.addSublayer(shapeLayer) 

} 

Ve tabii uygulanması olacağını ben kabul cevap değiştirildi Ne

drawLineFromPointToPoint(startX: Int, toEndingX: Int, startingY: Int, toEndingY: Int, ofColor: UIColor, widthOfLine: CGFloat, inView: UIView) 

ben sağlayan değişkenler değişti ve bu girişe kolay başlangıç ​​ve bitiş yapılan hem x hem de y. Ayrıca kullanıcının çizginin genişliğini değiştirmesine izin veriyorum.

Değerlerin Int türünde olmasını tercih ettim, ancak bunları izin verilen diğer seçenekler olarak değiştirebilirsiniz.

0

üstte yatay çizgi çizmek için:

let path = UIBezierPath() 
path.moveToPoint(CGPoint(x: 0, y: 0)) 
path.addLineToPoint(CGPoint(x: yourView.frame.width, y: 0)) 

let shapeLayer = CAShapeLayer() 
shapeLayer.path = path.CGPath 
shapeLayer.strokeColor = UIColor.lightGrayColor().CGColor 
shapeLayer.lineWidth = 0.5 

yourView.layer.addSublayer(shapeLayer) 

altındaki yatay bir çizgi çizmek için: Doğrusu böyle görüntüleri kullanmaktan daha

let path = UIBezierPath() 
path.moveToPoint(CGPoint(x: 0, y: yourView.frame.height)) 
path.addLineToPoint(CGPoint(x: yourView.frame.width, y: yourView.frame.height)) 

let shapeLayer = CAShapeLayer() 
shapeLayer.path = path.CGPath 
shapeLayer.strokeColor = UIColor.lightGrayColor().CGColor 
shapeLayer.lineWidth = 0.5 

yourView.layer.addSublayer(shapeLayer) 
İlgili konular