在UIView上绘制点和线

时间:2015-12-10 15:43:44

标签: ios swift drawing core-graphics

根据我在Apple Swift website上找到的一个例子,我给自己做了一个练习Swift的练习:

enter image description here

正如你所看到的那样,中间有一条河流和几个点,形成一条小路。所以我开始在互联网上寻找类似的河流图像,我已经创建了一个Xcode游乐场。这就是我现在所拥有的:

enter image description here

所以基本上我有一个UIView,其子视图包含我找到的河流图像和一个用UIBezierPath制作的点。

我的第一个问题是:这是吸引UIView的正确方法吗?我的意思是使用UIBezierPath。我的第二个问题是:如何在UIView内的精确坐标处绘制点? (UIBezierPath或其他一切?)

更准确地说,我的目的是制作一个算法,让程序识别图像,并根据像素颜色从河的起点到终点绘制一条点线,在它之间传递中间。

2 个答案:

答案 0 :(得分:10)

要在UIBezierPath上绘制UIView,请执行以下操作:

let xCoord = 10
let yCoord = 20
let radius = 8

let dotPath = UIBezierPath(ovalInRect: CGRectMake(xCoord, yCoord, radius, radius))

let layer = CAShapeLayer()
layer.path = dotPath.CGPath
layer.strokeColor = UIColor.blueColor().CGColor

drawingView.layer.addSublayer(layer)

此代码将在视图上绘制一个半径为8且坐标为10,20的点。

更新:Swift 4 +

let xCoord = 10
let yCoord = 20
let radius = 8

let dotPath = UIBezierPath(ovalIn: CGRect(x: xCoord, y: yCoord, width: radius, height: radius))

let layer = CAShapeLayer()
layer.path = dotPath.cgPath
layer.strokeColor = UIColor.blue.cgColor

drawingView.layer.addSublayer(layer)

答案 1 :(得分:2)

以下是对等式的线部分的尝试:

    var offset:CGFloat    = 0;    var squareWidth:Int = 20
    var squareRows:Int    = Int(view.frame.size.width/CGFloat(squareWidth))
    var squareColumns:Int = Int(view.frame.size.height/CGFloat(squareWidth))

    for (index,element) in (0...squareRows).enumerate(){
        for (column,element) in (0...squareColumns).enumerate(){
            // Build The Square
            let rectanglePath = UIBezierPath(roundedRect: CGRectMake(
                view.frame.minX + CGFloat(squareWidth * index) - offset,
                view.frame.minY + CGFloat(column * squareWidth), 20, 20
                ),
                cornerRadius: 0.00)

            // Style Square
            let a = CAShapeLayer()
                a.path = rectanglePath.CGPath
                a.strokeColor = UIColor.whiteColor().CGColor
                a.fillColor = nil
                a.opacity = 0.3
                a.lineWidth = 1.5
            view.layer.insertSublayer(a, atIndex: 1)
        }
    }

View Rendered with layers