在Swift Xcode

时间:2016-01-11 15:26:47

标签: ios swift optimization drawing

下面的类附加到UIView并在屏幕上移动手指的同时绘制线条。然而,当从左到右从上到下移动手指非常快时,绘图暂时在改变方向上显示尖锐的尖边。这在设备和模拟器上都会发生。

造成这个问题的原因是什么?如何在代码中消除这种假象,以便在快速改变方向时只能看到平滑的圆形,而不是锐利的边缘?

enter image description here

class drawLine: UIView
{
var comittedSegments: Int = 0
var points = [CGPoint]()
var committedPath = UIBezierPath()

var drawPath = UIBezierPath()
var incrementalImage: UIImage?

var strokeColor:UIColor?

override func drawRect(rect: CGRect) {
    autoreleasepool {
        incrementalImage?.drawInRect(rect)
        strokeColor = UIColor.darkGrayColor()
        strokeColor?.setStroke()
        drawPath.lineWidth = 20
        drawPath.lineCapStyle = CGLineCap.Round
        drawPath.stroke()
    }
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let touch: AnyObject? = touches.first

    comittedSegments = 0
    committedPath.removeAllPoints()
    points.removeAll()

    points.append( touch!.locationInView(self) )
}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let touch: AnyObject? = touches.first
    let point = touch!.locationInView(self)

    points.append( point )

    if points.count == 5
    {
        points[3] = CGPointMake((points[2].x + points[4].x)/2.0, (points[2].y + points[4].y)/2.0)

        committedPath.moveToPoint(points[0])
        committedPath.addCurveToPoint(points[3], controlPoint1: points[1], controlPoint2: points[2])
        comittedSegments = comittedSegments + 1

            self.setNeedsDisplay()

        points[0] = points[3]
        points[1] = points[4]

        points.removeRange(2...4)

        drawPath = committedPath
    }
    else if points.count > 1
    {

        drawPath = committedPath.copy() as! UIBezierPath

        drawPath.CGPath = committedPath.CGPath

        drawPath.moveToPoint( points[0] )
        for point in points[1..<points.count] {
            drawPath.addLineToPoint(point)
        }

        self.setNeedsDisplay()
    }
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    self.drawBitmap()
    self.setNeedsDisplay()

    committedPath.removeAllPoints()
    points.removeAll()
}

override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
    self.touchesEnded(touches!, withEvent: event)
}

func drawBitmap() {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, 0.0)
    strokeColor?.setStroke()
    if(incrementalImage == nil) {
        let rectPath:UIBezierPath = UIBezierPath(rect: self.bounds)
        UIColor.whiteColor().setFill()
        rectPath.fill()
    }

    incrementalImage?.drawAtPoint(CGPointZero)
    committedPath.stroke()
    incrementalImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
}
}

1 个答案:

答案 0 :(得分:2)

除了设置lineCapStyle之外,请设置lineJoinStyle

drawPath.lineJoinStyle = .Round
drawPath.lineCapStyle = .Round