Swift中的cgp回调
我正在尝试将Quartz 2D编程指南(第101页和第102页)中给出的示例信息转换为swift,但在回拨实施过程中遇到错误,如有任何帮助,将不胜感激。这是我的全部代码Swift中的cgp回调,swift,Swift,我正在尝试将Quartz 2D编程指南(第101页和第102页)中给出的示例信息转换为swift,但在回拨实施过程中遇到错误,如有任何帮助,将不胜感激。这是我的全部代码 override func drawRect(rect: CGRect) { var context = UIGraphicsGetCurrentContext() //Step 1 // refer to function MyDrawStencilStar //Step 2
override func drawRect(rect: CGRect) {
var context = UIGraphicsGetCurrentContext()
//Step 1
// refer to function MyDrawStencilStar
//Step 2
let baseSpace = CGColorSpaceCreateDeviceRGB()
let patternSpace = CGColorSpaceCreatePattern(baseSpace)
CGContextSetFillColorSpace(context, patternSpace)
//Step 3
var callback : CGPatternCallbacks = CGPatternCallbacks (version: 0, drawPattern: &MyDrawStencilStar,releaseInfo: nil)
//……我在指向drawPattern的指针上方的行中遇到错误,错误是“(Void,context:CGContextRef)->()”不能转换为“@lvalue inout$T3”
var pattern = CGPatternCreate(nil,
CGRectMake(0, 0, Psize/2, Psize/2),
CGAffineTransformMake(1, 0, 0, 1, 1, 1),
Psize/2,
Psize/2,
kCGPatternTilingConstantSpacing,
false,
&callback)
}
func MyDrawStencilStar (info : Void, context : CGContextRef) {
var theta : Double = 0.0
var r : Double = 0.0
r = 0.8 * Double (Psize) / 2
theta = 2 * M_PI * 2 / 5 //144 degrees
CGContextTranslateCTM(context, Psize/2, Psize/2)
CGContextMoveToPoint(context, 0, CGFloat(r))
for var k : CGFloat = 0; k<5; ++k {
var x : CGFloat = CGFloat(r) * sin(k * CGFloat(theta))
var y : CGFloat = CGFloat(r) * cos(k * CGFloat(theta))
CGContextAddLineToPoint(context, x, y)
}
CGContextClosePath(context)
CGContextFillPath(context)
}
var pattern=CGPatternCreate(无,
CGRectMake(0,0,Psize/2,Psize/2),
CGAffineTransformMake(1,0,0,1,1,1),
Psize/2,
Psize/2,
kCGPatternTilingConstantSpacing,
错误的
&(回拨)
}
func MyDrawStencilStar(信息:Void,上下文:CGContextRef){
变量θ:双=0.0
变量r:Double=0.0
r=0.8*双倍(Psize)/2
θ=2*M_π*2/5//144度
CGContextTranslateCm(上下文,Psize/2,Psize/2)
CGContextMoveToPoint(上下文,0,CGFloat(r))
对于var k:CGFloat=0;k这个解决方案是有问题的:
函数“MyDrawStencilStar”应获取UnsafemtablePointer
CGPatternCallbacks中注册的指针应为CFunctionPointer)->Void)
这意味着函数指针应该先转换为UnasFemeutablePointer,然后转换为CopaQueepointer,再转换为CFuncfionPointer
尽管如此,我还是在函数调用中遇到了一个异常,有一个更简单的解决方案:
您正在使用的CoreGraphics API的可能副本使用了C函数指针,Swift不支持。有关更多信息,请参阅副本。查看我的答案