我是一个Objective-C菜鸟,已经搜寻了很多内容,但还没有找到答案:
在我的RubyMotion项目中,我有一个名为StatusGuage的UIView子类,其中包含一个名为drawLinearGradient的方法,如下所示:
def drawLinearGradient(context, rect, startColor, endColor)
colorspace = CGColorSpaceCreateDeviceRGB()
locations = [0.0, 1.0]
# colors = NSArray.arrayWithObjects(startColor, endColor, nil)
# ptrColors = Pointer.new(:object, colors)
colors = [startColor, endColor, nil]
# CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef) colors, locations);
CGGradientCreateWithColors(colorspace, colors, locations)
end
我想知道如何调用CGGradientCreateWithColors。它显然期望使用(CFArrayRef)指针,但是我无法弄清楚如何将其传递给我。我尝试过的迭代之一已被注释掉。
这是错误消息:
2012-05-11 16:57:36.331 HughesNetMeter[34906:17903]
*** Terminating app due to uncaught exception 'TypeError',
reason: 'status_guage.rb:43:in `drawLinearGradient:': expected
instance of Pointer, got `[0.0, 1.0]' (Array) (TypeError)
from status_guage.rb:13:in `drawRect:'
谢谢你的帮助。
最佳答案
有几件事。错误不是在谈论颜色,而是在指向const CGFloat locations[]
参数。
这应该是可以这样实现的指针(Reference on Pointer class)
locations = Pointer.new(:float, 2)
locations[1] = 1.0
接下来,您的数组不需要
nil
终止。在Ruby中,这将创建一个包含3个对象的数组,这不是您想要的,因为它很可能导致CGGradientCreateWithColors()
函数困惑这看起来像http://www.raywenderlich.com/的示例,因此剩下的就是
def drawLinearGradient(context, rect, startColor, endColor)
colorspace = CGColorSpaceCreateDeviceRGB()
locations = Pointer.new(:float, 2)
locations[1] = 1.0
colors = [startColor, endColor]
gradient = CGGradientCreateWithColors(colorspace, colors, locations)
startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect))
endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect))
CGContextSaveGState(context)
CGContextAddRect(context, rect)
CGContextClip(context)
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0)
CGContextRestoreGState(context)
end
最后的旁注
在这种情况下,甚至不需要
locations
参数,因为CGGradientCreateWithColors()
会自动将第一种和最后一种颜色的值设置为0.0和1.0。检查CGGradient Reference