【问题标题】:Nil is not compatible with expected argument type CGAffineTransformNil 与预期的参数类型 CGAffineTransform 不兼容
【发布时间】:2017-04-04 15:33:37
【问题描述】:

我正在尝试绘制路径:CGMutablePath 但在添加路径时遇到问题。 Nil 与预期的参数类型不兼容 'UnsafePointer'CGAffineTransform'

override func draw(_ rect: CGRect) {

            let context = UIGraphicsGetCurrentContext()

            let path = CGMutablePath()
            CGPathAddArc(path, nil, centerX, centerY, radius, -CGFloat(M_PI/2), CGFloat(GLKMathDegreesToRadians(currentAngle)), false)

            context!.addPath(path)
            context!.setStrokeColor(UIColor.blue.cgColor)
            context!.setLineWidth(3)
            context!.strokePath()
       }

尝试了一些将 nil 替换为 0, options: nil, options: [ ] 的方法,但这些都不起作用。

在@vadian 回答的帮助下。 解决方案:

override func draw(_ rect: CGRect) {

            let context = UIGraphicsGetCurrentContext()!

            let path = CGMutablePath()
            path.addArc(center: CGPoint(x:centerX, y:centerY), radius: radius, startAngle: -(CGFloat.pi / 2), endAngle: CGFloat(GLKMathDegreesToRadians(currentAngle)), clockwise: false)

            context.addPath(path)
            context.setStrokeColor(UIColor.blue.cgColor)
            context.setLineWidth(3)
            context.strokePath()
       }

【问题讨论】:

    标签: swift swift3 cgaffinetransform cgrect cgpath


    【解决方案1】:

    CGMutablePath在Swift 3中添加弧的函数的签名是

    func addArc(center: CGPoint, radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat, clockwise: Bool, transform: CGAffineTransform = default)
    

    在您的情况下(center 必须是 CGPoint

    path.addArc(center: CGPoint(x:centerX, y:centerY), 
                radius: radius, 
            startAngle: -(CGFloat.pi / 2), 
              endAngle: CGFloat(GLKMathDegreesToRadians(currentAngle)), 
             clockwise: false)
    

    为了避免四个感叹号直接展开上下文

    let context = UIGraphicsGetCurrentContext()!
    

    并删除所有其他!

    【讨论】:

    • 添加一个小例子来说明如何避免在 OP 的代码中使用所有 ! 可能也不错。
    • @rmaddy 在这种特殊情况下,强制展开的上下文非常好。根据文档,任何UIView 在调用drawRect 之前都会提供一个有效的上下文(在调用它的drawRect: 方法之前,视图对象将一个有效的上下文推送到堆栈上,使其成为当前的。)跨度>
    • 然后执行let context = UIGraphicsGetCurrentContext()! 并避免使用所有context!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多