2

我尝试使用 CGMutablePathRef 和 CGPoint 作为输入和 NULL/nil 而不是像这样的 CGAffineTransformation 在 Swift 中调用 CGPathMoveToPoint()

CGPathMoveToPoint(path, nil, point.x as CGFloat, point.y as CGFloat)

但是,我总是收到一条错误消息,指出无法将表达式转换为 NilLiteralConvertible 类型。你知道为什么这段代码不起作用吗?在 Swift 中应该使用什么来代替 nil 参数?我尝试使用 CGAffineTransformidentity 而不是 nil 但它也不起作用。谢谢!

4

5 回答 5

3

这段代码在视图中填充了一个红色矩形:

let context:CGContextRef = NSGraphicsContext.currentContext()!.CGContext

var pathPoint:CGPoint = CGPoint()
pathPoint.x = CGFloat(225.0)
pathPoint.y = CGFloat(100.0)

var myMutablePath:CGMutablePath = CGPathCreateMutable()
CGPathMoveToPoint(myMutablePath, nil, pathPoint.x, pathPoint.y)
CGPathAddLineToPoint(myMutablePath, nil, pathPoint.x + CGFloat(50.0), pathPoint.y)
CGPathAddLineToPoint(myMutablePath, nil, pathPoint.x + CGFloat(50.0), pathPoint.y  + CGFloat(50.0))
CGPathAddLineToPoint(myMutablePath, nil, pathPoint.x, pathPoint.y  + CGFloat(50.0))
CGPathAddLineToPoint(myMutablePath, nil, pathPoint.x, pathPoint.y)

CGContextAddPath(context, myMutablePath);

CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0)
CGContextFillPath(context)
于 2014-12-15T05:40:11.413 回答
1

如果这与Swift3一起出现,只需检查新语法。Xcode 错误消息具有误导性,这不仅仅是 nil 的问题。您的代码的新语法示例:

path.move(to: point)
于 2017-02-26T19:16:16.617 回答
1

我接受了jwlaughton的回答,将其放在UIView子类的上下文中,使布局更加灵活,并将Core Graphics调用更新为 Swift 4,如 Xcode 9.4 自动完成所示。

class RedSquareView: UIView {
    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else { return }
        let length = rect.width < rect.height ? (rect.width * 0.25) : (rect.height * 0.25)
        let start:CGPoint = CGPoint(x: rect.midX - (length/2), y:rect.midY - (length/2))

        let path = CGMutablePath()
        path.move(to: start)
        path.addLine(to: CGPoint(x:start.x + length, y:start.y))
        path.addLine(to: CGPoint(x:start.x + length, y:start.y + length))
        path.addLine(to: CGPoint(x:start.x, y:start.y + length))
        path.addLine(to: CGPoint(x:start.x, y:start.y))

        context.addPath(path)
        context.setFillColor(red:1.0, green:0.0, blue:0.0, alpha:1.0)
        context.fillPath()
    }
}
于 2018-06-05T16:17:42.373 回答
0

下面的代码对我来说可以编译。请注意,它使用 CGMutablePath,而不是 CGMutablePathRef。

var myMutablePath:CGMutablePath = CGPathCreateMutable()
CGPathMoveToPoint(myMutablePath, nil, CGFloat(1.0), CGFloat(1.0))
于 2014-12-15T03:28:34.200 回答
0

我怀疑你的path- 你没有展示它是什么,那么我们怎么知道它真的是一个 CGPath?但是,还有这样的:

point.x as CGFloat

那不是斯威夫特。如果它已经不是 CGFloat ,你想说CGFloat(point.x)(对于 也是如此)。point.y

于 2014-12-15T01:57:54.517 回答